Linux环境部署Django平台(图文详解)
安装环境:
[root@room ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
1.创建django项目
点击file-->new project--> Django-->Location(设定项目名称),这里采用习惯命名的mysite。
选择python解释器版本,点击create按钮,Django将自动生成下面的目录结构: file->settings->languages&frame works->Django
2. 创建虚拟环境
[root@room ~]# python3 -m venv /opt/djenv
[root@room ~]# cd /opt/djenv/
[root@room djenv]# ls
bin include lib lib64 pyvenv.cfg
3. 激活虚拟环境
[root@room ~]# source /opt/djenv/bin/activate
(djenv) [root@room ~]#
4. 在pycharm中修改项目解释器
File -> Settings -> Project Interpreter -> 点击齿轮,add local ->
existing environment -> 找到/opt/djenv/bin/python
5.在虚拟环境中安装django
(djenv) [root@room ~]# pip install django==1.11.6
Collecting django==1.11.6
Downloading http://pypi.doubanio.com/packages/82/33/f9d2871f3aed5062661711bf91b3ebb03daa52cc0e1c37925f3e0c4508c5/Django-1.11.6-py2.py3-none-any.whl (6.9MB)
100% |████████████████████████████████| 7.0MB 31.0MB/s
Collecting pytz (from django==1.11.6)
Downloading http://pypi.doubanio.com/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
100% |████████████████████████████████| 512kB 165kB/s
Installing collected packages: pytz, django
Successfully installed djanfile->settings->languages&frame works->Djangogo-1.11.6 pytz-2018.5
You are using pip version 9.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Django项目管理:
1. 创建项目
(djenv) [root@room ~]# django-admin startproject mysite #第一步若已创建,则此步骤可以忽略
(djenv) [root@room ~]# cd mysite/
2. 在pycharm中配置django
file->settings->languages&frame works->Django
3 . django项目最终应该放到apahce/nginx服务器上,对外提供服务。在开发过程中,为了方便,django提供了一个内建的服务器。
4. 启动内建服务器,0:80是0.0.0.0:80的简写(若80端口已占用,先关闭80端口)
(djenv) [root@room mysite]# python manage.py runserver 0:80
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 17, 2018 - 11:19:16
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://0:80/
Quit the server with CONTROL-C.
5. 在mariadb中为django项目创建数据库部署django平台django
CREATE DATABASE lmzf DEFAULT CHARSET utf8;
(djenv) [root@room mysite]# mysql -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 315
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE lmzf DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> exit
6. 修改数据库设置
(djenv) [root@room mysite]# vim mysite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lmzf',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
ALLOWED_HOSTS = '*'
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
7. 配置pymysql模块
(djenv) [root@room mysite]# pip install pymysql
Collecting pymysql
Downloading http://pypi.doubanio.com/packages/a7/7d/682c4a7da195a678047c8f1c51bb7682aaedee1dca7547883c3993ca9282/PyMySQL-0.9.2-py2.py3-none-any.whl (47kB)
100% |████████████████████████████████| 51kB 216kB/s
Collecting cryptography (from pymysql)
Downloading http://pypi.doubanio.com/packages/59/32/92cade62c645756a83598edf56289e9b19aae5370642a7ce690cd06bc72f/cryptography-2.3.1-cp34-abi3-manylinux1_x86_64.whl (2.1MB)
100% |████████████████████████████████| 2.1MB 209kB/s
Collecting six>=1.4.1 (from cryptography->pymysql)
Downloading http://pypi.doubanio.com/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Collecting idna>=2.1 (from cryptography->pymysql)
Downloading http://pypi.doubanio.com/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
100% |████████████████████████████████| 61kB 215kB/s
Collecting asn1crypto>=0.21.0 (from cryptography->pymysql)
Downloading http://pypi.doubanio.com/packages/ea/cd/35485615f45f30a510576f1a56d1e0a7ad7bd8ab5ed7cdc600ef7cd06222/asn1crypto-0.24.0-py2.py3-none-any.whl (101kB)
100% |████████████████████████████████| 102kB 199kB/s
Collecting cffi!=1.11.3,>=1.7 (from cryptography->pymysql)
Downloading http://pypi.doubanio.com/packages/6d/c0/47db8f624f3e4e2f3f27be03a93379d1ba16a1450a7b1aacfa0366e2c0dd/cffi-1.11.5-cp36-cp36m-manylinux1_x86_64.whl (421kB)
100% |████████████████████████████████| 430kB 208kB/s
Collecting pycparser (from cffi!=1.11.3,>=1.7->cryptography->pymysql)
Downloading http://pypi.doubanio.com/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz (158kB)
100% |████████████████████████████████| 163kB 208kB/s
Installing collected packages: six, idna, asn1crypto, pycparser, cffi, cryptography, pymysql
Running setup.py install for pycparser ... done
Successfully installed asn1crypto-0.24.0 cffi-1.11.5 cryptography-2.3.1 idna-2.7 pycparser-2.19 pymysql-0.9.2 six-1.11.0
You are using pip version 9.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
(djenv) [root@room mysite]# vim mysite/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
8. 访问后台管理界面 http://127.0.0.1/admin
(djenv) [root@room mysite]# python3 manage.py runserver 0:80
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 17, 2018 - 19:34:33
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://0:80/
Quit the server with CONTROL-C.
9. 生成数据库
(djenv) [root@room mysite]# 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/1.11/ref/databases/#mysql-sql-mode
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 sessions.0001_initial... OK
10. 创建管理员账号
(djenv) [root@room mysite]# python manage.py createsuperuser
Username (leave blank to use 'root'):
Email address: lmzf@163.com
Password:
Password (again):
Superuser created successfully.
11.进入mariadb查看库表
(djenv) [root@room mysite]# mysql -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 331
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lmzf |
| mysql |
| performance_schema | |
| test |
+--------------------+
7 rows in set (0.00 sec)
MariaDB [(none)]> use lmzf;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [lmzf]> desc polls_choice;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| choice_text | varchar(200) | NO | | NULL | |
| votes | int(11) | NO | | NULL | |
| question_id | int(11) | NO | MUL | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
MariaDB [lmzf]> show tables;
+----------------------------+
| Tables_in_lmzf |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| polls_choice |
| polls_question |
+----------------------------+
12 rows in set (0.00 sec)
MariaDB [lmzf]> desc polls_choice;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| choice_text | varchar(200) | NO | | NULL | |
| votes | int(11) | NO | | NULL | |
| question_id | int(11) | NO | MUL | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
MariaDB [lmzf]> desc polls_question;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| question_text | varchar(200) | NO | | NULL | |
| publish_date | datetime | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
管理应用APP
1. 创建应用
(djenv) [root@room mysite]# python manage.py startapp polls
2. 将应用添加到项目中
INSTALLED_APPS = [
... ...
'polls',
]
3. 配置路由URLConf,当访问http://127.0.0.1/polls/开头的网址,都交由polls应用。当用户访问一个网址时,都是找到mysite/urls.py查找使用哪个视图函数去处理。可以在该文件中授权将以http://127.0.0.1/polls/开头的网址,交给polls/urls.py处理
(djenv) [root@room mysite]# vim mysite/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^polls/', include('polls.urls')),
]
4. 创建polls主页URL声明
(djenv) [root@room mysite]# vim polls/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index') # http://127.0.0.1/polls/
]
5. 创建主面的视图文件
(djenv) [root@room mysite]# vim polls/views.py
from django.shortcuts import render, HttpResponse
def index(request):
return HttpResponse('<h1>Polls OK</h1>')
6. 访问http://127.0.0.1/,404页面不存在;访问http://127.0.0.1/polls/返回正确结果
(djenv) [root@room mysite]# python manage.py runserver 0:80
Performing system checks...
System check identified no issues (0 silenced).
October 17, 2018 - 20:00:15
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://0:80/
Quit the server with CONTROL-C.
创建模型
1. 创建模型
(djenv) [root@room mysite]# vim polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
publish_date = models.DateTimeField('date published')
class Choice(models.Model):
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
2. 生成数据库中的表
(djenv) [root@room mysite]# python manage.py makemigrations
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Choice
- Create model Question
- Add field question to choice
(djenv) [root@room mysite]# 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/1.11/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
3. 分析表
数据库中将会为Question和Choice创建polls_question,polls_choice和 polls_question表中有三个字段。我们没有手工指定主键,django自动创建一个名为id的字段,将它设置为主键,主键可以自动增长 polls_choice表中有四个字段。主键与polls_question一样。class中question是外键,那么polls_choice表中就会出现一个question_id的外键。如果将class中的question改名为q,那么表中的question_id就会变为q_id
4. 将模型注册到管理后台
(djenv) [root@room mysite]# vim polls/admin.py
from django.contrib import admin
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
5. 访问管理后台,可以看到两个模型
访问http://127.0.0.1/admin,用户名是数据库设定的root及密码
6. 在后台添加问题后,每个问题都显示为Question object,解决方法如下:
(djenv) [root@room mysite]# vim polls/models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
publish_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
7. 再次访问http://127.0.0.1/admin
(djenv) [root@room mysite]# python manage.py runserver 0:80
Performing system checks...
System check identified no issues (0 silenced).
October 17, 2018 - 20:28:50
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://0:80/
Quit the server with CONTROL-C.
8.自定义管理后台,后面增加显示的字段
(djenv) [root@room mysite]# vim polls/admin.py
from django.contrib import admin
from .models import Question, Choice
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'publish_date')
class ChoiceAdmin(admin.ModelAdmin):
list_display = ('question', 'choice_text', 'votes')
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice, ChoiceAdmin)
9. 为问题增加时间过滤器
(djenv) [root@room mysite]# vim polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'publish_date')
list_filter = ('publish_date',) # 增加此项
10. 为Question增加时间轴,点击时间,可以看到某个时间发布的问题
(djenv) [root@room mysite]# vim mysite/settings.py
USE_TZ = False
(djenv) [root@room mysite]# vim /etc/my.cnf
default-time_zone = '+08:00'
(djenv) [root@room mysite]# vim polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'publish_date')
list_filter = ('publish_date',)
date_hierarchy = 'publish_date' #增加此行
11. 增加搜索,可以通过问题中的关键字时行搜索;
添加choice时,显示Question的详情(注意,必须是外键关系);
为question增加默认排序,第一标准是时间,第二标准是问题
(djenv) [root@room mysite]# vim polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'publish_date')
list_filter = ('publish_date',)
date_hierarchy = 'publish_date'
search_fields = ('question_text',) #增加搜索,可以通过问题中的关键字时行搜索;
ordering = ('-publish_date', 'question_text')
#为question增加默认排序,第一标准是时间第二标准是问题;-publish_date 表示降序排列
class ChoiceAdmin(admin.ModelAdmin):
list_display = ('question', 'choice_text', 'votes')
raw_id_fields = ('question',) #添加choice时,显示Question的详情(注意,必须是外键关系)