这是一个Django博客。
BlogRayiooo
= python3.6/32位
+ apache2.4/32位
+ MySQL
+ win10 server
- django
- pymysql
- mod_wsgi
- markdown2
- PyCharm(IDE)
- phpStudy(Apache2.4/32位、MySQL等环境的一键配置工具,超好用!)
首先我们要建立一个django工程,并使得它在本地能够被访问。
在PyCharm的File/New Project
中新建一个Django项目。
Django默认使用了python自带的SQLite数据库。我在这里修改它,当然你也可以使用SQLite进行存储数据。
在mysite/settings.py
中修改数据库类型为MySQL,如下:
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blogdb',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
如果不想将数据库密码同步到Github公开项目中,可以创建一个dbpass.py
文件,将数据库登入数据存储在那里,然后在此处引用,并且将其放入.gitignore
文件中,即可在Commit时忽略此文件。
通过phpStudy的MySQL管理器进入数据库,新建一个数据库blogdb
,并保持数据库登入账号密码与上面的值相同。
Django默认帮我们做很多事情,比如User、Session 这些都需要创建表来存储数据,Django已经把这些模块帮我准备好了,我们只需要执行数据库同步,把相关表生成出来即可:↻
mysite> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
如果在这个过程中出现任何错误,参照 django数据库错误相关问题。
要想登录django自带的admin后台,必须要有帐号,这个账号和数据库账号是不同的。接下来创建超级管理员帐号。↻
mysite> python manage.py createsuperuser
Username (leave blank to use 'fnngj'): admin # 管理员帐号
Email address: admin@mail.com # email
Password: # 密码
Password (again): # 重复密码
Superuser created successfully.
在PyCharm中直接运行程序,服务器即可启动。当然也可以通过python manage.py runserver
命令行指令执行。
访问 127.0.0.1:8000 以及 127.0.0.1:8000/admin 即可在本地查看主界面和admin界面。
输入之前设定的账号密码,即可进入django自带的数据库管理界面。
特别参考:windows 下 apache 部署 django python3.6
特别强调注意的是:apache 的位制和python的位制必须一致(即apache 32位的就只能安装python 32位的,64位也一样)网上很多教程没强调这一点,导致后续的很多工作白费,还找不到问题所在!
因此如果使用phpStudy的apache 32位,就必须使用python 32位。当然你也可以下载独立的Apache进行相应操作。
部署服务器端的时候,需要将之前在开发时进行的测试操作重新执行一遍。
通过pip install mod_wsgi
安装mod_wsgi。
如果无法直接安装,就到https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi下载whl文件,放到任意目录下,并在该目录下启动cmd,输入pip install 文件名.whl
安装模块。
比如Apache2.4、python3.6/32位就选择下载mod_wsgi‑4.6.4+ap24vc14‑cp36‑cp36m‑win32.whl
。
在命令行中输入以下指令:
mod_wsgi-express module-config
可以看到以下wsgi模块位置的输出结果,将它们复制下来。(在cmd中选中、右击即可复制粘贴。)
LoadFile "c:/program files (x86)/python36/python36.dll"
LoadModule wsgi_module "c:/program files (x86)/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "c:/program files (x86)/python36"
在phpStudy软件中点击其他选项菜单/打开配置文件/httpd-conf
,把这三行内容复制到到LoadModule最后的部分(应该也可以复制到整个文件的最后部分)。
同样,在apache的http.conf末尾添加下面的内容。目录不同,请对照自己的项目做相应更改。
#指定website的wsgi.py配置文件路径
WSGIScriptAlias / C:/Users/Administrator/Desktop/WebServer/_180524_BlogRayiooo/mysite/wsgi.py
#指定项目路径
WSGIPythonPath C:/Users/Administrator/Desktop/WebServer/_180524_BlogRayiooo
<Directory C:/Users/Administrator/Desktop/WebServer/_180524_BlogRayiooo/mysite>
<Files wsgi.py>
Require all granted
setHandler wsgi-script
</Files>
</Directory>
在项目的wsgi.py文件中import os
后添加如下代码。
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
在phpStudy中重启apache,从本地(127.0.0.1)和外网(服务器地址)分别访问,查看是否配置成功。
如果出现HTTP 500 - Internal server error
错误,在apache/logs/error.log中查看错误原因。
如果出现DisallowedHost at /
错误,就在项目的settings.py文件下做出更改:
ALLOWED_HOSTS = ['*']
最终访问成功,只不过在admin页面中缺失了css文件。
参考文档:django静态文件配置
静态文件配置就是为了让用户请求时django服务器能找到静态文件并返回。在开发时,静态文件存储在python安装目录下,但是在服务器上运行django时则无法从该目录获取静态文件,就会出现css缺失而导致3.2.5中所述情况发生。
首先要理解几个概念:
- 媒体文件:用户上传的文件
- 静态文件:css,js,image等
- 开发环境:使用django内置服务器处理静态文件
- 生产环境:使用apache2/nginx服务器处理静态文件映射
所以在配置时要分清楚开发环境还是生产环境。为了在生产环境中也能使用到静态文件,而不会出现访问时找不到css、js文件的问题,我们进行以下配置。
在settings.py中配置static静态文件夹路径如下:
STATIC_URL = '/static/'
# 总的static目录
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 放各个app的分static目录及公共的static目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'blog/static'),
]
在cmd中运行python manage.py collectstatic
,即可将原本放在python安装目录下的admin的静态文件收集到工程文件夹下的static目录下。
通过Github将本地收集到的static文件们同步到服务器端后,在服务器的apache的httpd.conf文件夹下进行如下配置:
# set static path
Alias /static "C:\Users\Administrator\Desktop\WWW\BlogRayiooo\static"
<Directory "C:\Users\Administrator\Desktop\WWW\BlogRayiooo\static">
Require all granted
</Directory>
这表示我们将"C:\Users\Administrator\Desktop\WWW\BlogRayiooo\static"
这个路径的东西映射到网站的http://我的IP/static
分支下。这时我的http.conf文件里应该是这样的:
这段配置应当放到wsgi配置前,以保证载入wsgi时不再缺失static文件。
重启phpStudy的apach,即可在远端成功加载css文件。(摸爬滚打一下午 + 一晚上终于完成)
每个博客的文章都包含了标题、作者、类型、发布时间、阅读量、文章内容、Url等字段。为了给这些元素建立一个数据库,我们将设计blog/models.py
文件,并使用django的migrations
指令和migrate
指令快速建库。
打开blog/models.py
,定义数据库的结构。了解更多请参阅 Django Models 文档
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=10, unique=True)
password = models.CharField(max_length=100)
email = models.EmailField()
last_login = models.DateTimeField()
date_joined = models.DateTimeField()
id = models.AutoField(primary_key=True, unique=True)
class ArticleType(models.Model):
type = models.CharField(primary_key=True, unique=True, max_length=10)
class Article(models.Model):
title = models.CharField(max_length=150)
author = models.ForeignKey(User, on_delete=models.PROTECT)
type = models.ForeignKey(ArticleType, on_delete=models.PROTECT)
content = models.TextField()
timestamp = models.DateTimeField()
click = models.IntegerField(default=0)
id = models.AutoField(primary_key=True)
利用python manage.py makemigrations blog
命令可以在blog/migrations
目录下建立一个migration,例如0001_initial.py
,在这个文件中根据你规定的models定义了一些建库操作。
因此,接下来执行python manage.py migrate
指令就可以根据migrations文件夹下的文件执行建库操作。
假如你在本地进行了makemigrations
,只需将migrations文件夹中的文件同步到服务器端,并在服务器端执行migrate
指令,即可便捷地完成建库。
D:\Coding Projects\Python\_180524_BlogRayiooo>python manage.py makemigrations blog
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Article
- Create model ArticleType
- Create model User
- Add field author to article
- Add field type to article
D:\Coding Projects\Python\_180524_BlogRayiooo>python manage.py migrate
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.0/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying blog.0001_initial... OK
编写blog/admin.py
文件如下:
from django.contrib import admin
from blog.models import User, ArticleType, Article
# Register your models here.
class UserAdmin(admin.ModelAdmin):
list_display = ['username', 'password', 'email']
class ArticleTypeAdmin(admin.ModelAdmin):
list_display = ['type']
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'author', 'type', 'content', 'timestamp', 'click']
admin.site.register(User, UserAdmin)
admin.site.register(ArticleType, ArticleTypeAdmin)
admin.site.register(Article, ArticleAdmin)
登陆网站的admin目录,添加完User和ArticleType后,就可以添加Article了。添加完成后点击SAVE
即可保存。
在blog/views.py
中修改内容如下:
from django.shortcuts import render, render_to_response
from blog.models import Article
# Create your views here.
def blog_article(request):
# 获取Article的所有数据到blog_list中(QuerySet类型)
blog_list = Article.objects.all()
# 创建一个dict方便传给模板网页(context)
c = {
'blog_list': blog_list,
}
# 将c交给article.html处理
return render_to_response('article.html', c)
在blog/templates/
下创建article.html
文件,当然这个目录要包含在settings.py
的TEMPLATES中。
Html文件编写如下:
{% for blog in blog_list %}
<h2>{{ blog.title }}</h2>
<p>{{ blog.timestamp }}</p>
<p>{{ blog.content }}</p>
{% endfor %}
如需了解Django的模板系统,参见 Django模板系统(非常详细) 。
在mysite/urls.py
中,你可以指定网站的分支目录显示哪些内容。
from django.contrib import admin
from django.urls import path
from blog import views as blog_views
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', blog_views.blog_article),
]
比如在上面的设置中,http://你的域名/blog/
目录将按照blog_views.blog_article
的设定显示内容。
登入 127.0.0.1:8000/blog/ 就可以查看效果了。
根据 django 快速搭建blog 最后一部分内容,美化blog。
根据 django1.10开发博客(11)——markdown与多说评论功能 的内容,将markdown格式的article解析到网页上。
windows 下 apache 部署 django python3.6
Django 静态文件配置(总static与分static)