Django

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。

Django是一个开放源代码的Web应用框架,由Python写成。

Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。

Django的安装

1
2
3
4
5
pip install Django

>>> import django
>>> django.VERSION
(2, 1, 7, 'final', 0)

创建工程

安装完django后我们会有一个 django-admin的管理工具,我们使用此工具来创建工程。

1
2
3
4
5
6
7
8
9
10
django-admin startproject projectname
$ cd projectname/
$ tree
.
|-- projectname
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py

目录说明:

projectname: 项目的容器。
manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
settings.py: 该 Django 项目的设置/配置。
urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

接下来我们进入 projectname 目录输入以下命令,启动服务器:

python manage.py runserver 0.0.0.0:8000

0.0.0.0 让其它电脑可连接到开发服务器,8000 为端口号。如果不说明,那么端口号默认为 8000。

在浏览器输入你服务器的 ip(这里我们输入本机 IP 地址: 127.0.0.1:8000) 及端口号,如果正常启动,会打开django默认页面。

创建 APP

python manage.py startapp 应用名

新建一个应用文件appname,它的里面也创建了一些py文件和包:

1
2
3
4
5
6
7
8
9
10
11
python manage.py startapp appname
.
|-- appname
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- migrations
| |-- models.py
| |-- test.py
| |-- views.py
| |-- urls.py

下面介绍这些文件都是什么:

admin.py:管理站点模型的声明文件,默认为空。
apps.py:应用信息定义文件。在其中生成了类Appconfig,类用于定义应用名等Meta数据。
migrations: 用于在之后定义引用迁移功能。
models.py: 添加模型层数据类的文件。
test.py:测试代码文件。
views.py:定义URL响应函数。
urls.py:需要自己创建,作为子路由。

创建好app后在settings.py中的INSTALLED_APPS添加appname

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appname',
]

网页和静态文件

appname中新建一个templates文件夹存放html

新建static文件夹存放js,image,css等

并且在settings.py中添加静态文件目录

1
2
3
4
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]

注意:每一个app中的static访问路径都是相同的。

在html中的使用:

1
2
3
4
5
6
7
8
首先创建了一个css文件

appname/static/js/style.css

如何使用,appname/templates/index.html里添加下面代码:

{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'js/style.css' %}" />

添加脚本目录

我们有一些脚本写在另一个文件夹,我们希望引入它们,在settings.py中添加

1
2
import sys
sys.path.insert(0, os.path.join(BASE_DIR, '/home/Scripts'))

数据库相关

部署静态文件

收集静态文件

python manage.py collectstatic

这一句话就会把以前放在app下static中的静态文件全部拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中

用UWSGI部署

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

WSGI是一种通信协议。

uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uwsgi安装命令

1
sudo pip install uwsgi --upgrade

uwsgi.ini配置文件编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[uwsgi]
http-socket = 0.0.0.0:80 # IP地址与端口号
chdir = /home/user/myProject/ # Django工程的目录
virtualenv = /home/user/pyvenv/env3.7 # python虚拟环境目录
wsgi-file = myProject/wsgi.py # wsgi.py的位置,接在chdir后面
static-map = /static=/home/user/myProject/static # 静态文件的位置
enable-threads = true # 允许在django创建线程
auto-procname = true # 自动给进程起名字
daemonize = /home/user/log/uwsgi.log # log地址
pidfile = /home/user/myProject/uwsgi.pid # 保存主进程pid的文件
disable-logging = true # log只记录错误信息
buffer-size = 51200 # 允许传输的字节数
processes = 4 # 进程数
threads = 2 # 线程数
vacuum = true # 允许主进程

关闭只能关闭pidfile里记录的pid号,不能kill其它三个进程

1
2
3
uwsgi --ini uwsgi.ini   # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭

部署到服务器

用 apache2 或 nginx 示例代码

apache2配置文件

1
2
3
4
5
Alias /static/ /path/to/collected_static/

<Directory /path/to/collected_static>
Require all granted
</Directory>

nginx 示例代码:

1
2
3
4
5
6
7
location /media  {
alias /path/to/project/media;
}

location /static {
alias /path/to/project/collected_static;
}

0%