从一个展示`Hello World`信息的hello.py文件开始,使其包含运行Django的相关代码,并能够完整运行。
通常会觉得选择Django之Web框架有点太重量级
了,官方教程中使用startproject
命令行参数(django-admin startproject)依据约定创建一些文件和目录,对于大型项目,会得益于startproject命令参数所提供的代码组织及项目结构约定;而对于小型项目,这些并不是必需的。以下利用Django的基本生成模块,设计一个简单项目,号称轻量级的Django项目,使用单个文件的方法实现之。
这个单个文件从一个hello.py
文件开始,但在实现之前,需要安装Python、Virtualenv、Django、Visual Studio Code环境工具,接下来进入正题。
Django是一个模型-模板-视图
(model-template-view,MTV)的框架,视图部分需要HTTP给出的请求和响应。在 hello.py
文件中创建执行返回响应Hello World信息的方法。
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
在Django的生成项目中 ,以上代码通常会放在应用程序内(django-admin startapp)的views.py
文件中。不过这仅仅是约定,对于视图要放在应用内部的什么位置,并没有规定。也就是说,视图也不一定要放在views.py
文件中。
Django 使用请求和响应对象
通过系统传递消息状态。当客户端发出一个请求消息时,Django 会创建一个 HttpRequest
对象,其中包含有关请求的元数据。 然后 Django 加载适当的视图,并将 HttpRequest
作为第一个参数传递给视图函数。 每个视图负责返回一个 HttpResponse
对象做出响应消息给客户端。
要在浏览器中访问视图,需要将其绑定到URL
的映射路径上,需要将其与一个URL
模式相关联,在本例中,服务器根路径会自己处理该视图。Django通过一个正则表达式与可调用的参数相匹配和视图的URL
路径进行关联。以下将创建的关联写在hello.py
文件中。
from django.urls import re_path
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
urlpatterns = (
re_path(r'^$', index),
)
同样,在Django的生成项目中 ,URL模式
约定放在urls.py
文件中,但没有强制规定,不一定非要放在其中,它们可以存在于任何可引用的Python
模块中。在本例的hello.py
文件中,将典型的views.py
文件与urls.py
文件的内容合并在一起了。
在运行项目之前,进入到Django的配置阶段,需要详细说明各种资源的方方面面,在本例中,会在调试模式下运行Django,将DEBUG
设为True
,还包括了一个固定的SECRET_KEY
设置,用于跨站点请求防伪(CSRF,Cross-site request forgery)保护,对每个项目需要随机生成,除此之外,Django仅仅需要配置根目录URL的位置,以便使用该模块中urlpatterns
所定义的值。
from django.conf import settings
settings.configure(
DEBUG=True,
SECRET_KEY='django-insecure-=ep4=uh86d_3)vm3vq6dt04f77pvqp+_akttiy(44#x&9u-jx5',
ROOT_URLCONF=__name__,
MIDDLEWARE=(
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
),
)
以上的配置中还有一项MIDDLEWARE
,它是要将激活的中间件组件,添加到 Django 设置中的MIDDLEWARE
元组中。而中间件是 Django 请求/响应处理的挂钩框架,这是一个轻量级的低级别“插件”系统,用于全局更改 Django 的输入或输出。每个中间件组件负责做一些特定的功能,在Django中就是request和response之间进行的处理,在本例中配置了三个必要的中间件类。
默认的startproject
命令参数生成的配置项会包含在settings.py
文件中,也会包含本例中未使用的设置,像国际化资源和静态资源等。
典型的Django项目带有一个manage.py
文件,该文件用于创建数据库表、启动开发服务器等多个命令,其中含有几行代码,在本例中将这个文件中的相关部分加到hello.py
文件中,实现与manage.py
相同的功能。完整的代码如下:
import os
import sys
from django.conf import settings
DEBUG = os.environ.get('DEBUG', 'on') == 'on'
SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-=ep4=uh86d_3)vm3vq6dt04f77pvqp+_akttiy(44#x&9u-jx5')
settings.configure(
DEBUG=DEBUG,
SECRET_KEY=SECRET_KEY,
ROOT_URLCONF=__name__,
MIDDLEWARE=(
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
),
)
from django.urls import re_path
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
urlpatterns = (
re_path(r'^$', index),
)
if __name__ == "__main__":
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
在命令行终端中输入以下命令启动本例项目:
python hello.py runserver
在浏览器中访问http://127.0.0.1:8000/
,将看到Hello World
的信息。
Django框架的核心是用于处理HTTP
协议的HttpRequest
请求,并返回HttpResponse
响应。在其中间过程中,就是后端开发设计的内容。在前面的hello.py
项目中,只是返回了Hello World
字符串。虽然项目已经可以在runserver
命令参数下可以运行了,但这只是一种基于标准库中的简单服务器,并不适合产品部署的安全性。
WSGI
(Python Web Server Gateway Interface)是为Python语言定义的Web服务器
和Web应用程序
或框架
之间的一种简单而通用的接口,基于CGI
标准而设计。通过标准化Web服务器和Python web应用程序
或框架
之间的行为和通信,WSGI使得编写可移植的Python web代码成为可能,使其能够部署在任何符合WSGI的web服务器上。独立的WSGI服务器相比传统web服务器,使用更少的资源,并提供最高的性能。
Waitress
是一个具备生产级品质并有高性能的纯python编写独立的WSGI服务器,它只依赖python标准库,不依赖任何第三方库。同时它可以在多平台下运行,如windows、linux等。虽然Gunicorn
也是纯python的WSGI应用服务器中热门选择,但其不支持windows
环境。安装Waitress的命令如下:
pip install -i https://mirrors.aliyun.com/pypi/simple/ waitress
每一个WSGI服务器都需要使用一个正确定义的WSGI应用。Django通过get_wsgi_application
提供了创建这个应用的方法。
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
以上代码包含在由startproject
命令参数所创建的wsgi.py
文件中。application
只是Django的一个约定名称,在hello项目中,也可以指定一个别的名称。
ALLOWED_HOSTS
的设置被用来验证HTTP HOST标头值,应该设置为一个可接受的HOST值的列表,其只允许来自列表中所设置主机的请求,否则,没有ALLOWED_HOSTS
环境变量的设置,它就会只允许来自localhost
的请求。以下为代码片段:
DEBUG = os.environ.get('DEBUG', 'on') == 'on'
SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-=ep4=uh86d_3)vm3vq6dt04f77pvqp+_akttiy(44#x&9u-jx5')
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split(',')
settings.configure(
DEBUG=DEBUG,
SECRET_KEY=SECRET_KEY,
ALLOWED_HOSTS=ALLOWED_HOSTS,
ROOT_URLCONF=__name__,
MIDDLEWARE=(
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
),
)
当waitress
安装完成后,可以通过waitress-serve的命令行方式来运行它,命令如下:
waitress-serve --listen=*:8000 hello:application
运行后,可以看到以下的运行信息:
INFO:waitress:Serving on http://[::]:8000
INFO:waitress:Serving on http://0.0.0.0:8000
在浏览器中打开http://127.0.0.1:8000的URL,可以看到Hello World
的信息。
Nginx
是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫
为俄罗斯访问量第二的Rambler.ru
站点(俄文:Рамблер)开发的。它在稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
可以到http://nginx.org/en/download.html下载NGINX的各平台的最新版本文件,解压缩到指定目录即可。
将NGINX与Django
整合,找到NGINX的conf
路径下的nginx.conf
文件,配置信息如下:
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 表示请求发起源
proxy_set_header Host $host; # 请求的主机名
proxy_set_header X-Real-IP $remote_addr; # 请求的真实IP
proxy_redirect off;
proxy_pass http://127.0.0.1:8000/; # 跨域转发
}
}
配置好NGINX, 切换到其安装目录,运行命令如下:
start nginx # 启动命令
nginx.exe -s quit # 停止退出命令
在浏览器访问 http://localhost,可以看到与之前相同的结果。
Hello项目是对由startproject
命令参数创建的的布局进行剪裁,形成一个最小项目的固定模式,将其转换为可复用的模板,使用相同的布局设计未来的项目。
startproject的模板是一个目录和文件(python源代码文件),当命令执行时形成Django模板。制作时将project_name
作为上下文传递,通过mkdir
命令创建project_name
目录,将hello.py
文件转换到项目模板中(project_name/project_name.py
)。文件的相关部分需要用变量
来替换,模板源文件代码(project_name.py
)如下:
# project_name.py
import os
import sys
from django.conf import settings
DEBUG = os.environ.get('DEBUG', 'on') == 'on'
SECRET_KEY = os.environ.get('SECRET_KEY', '{{ secret_key }}')
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split(',')
settings.configure(
DEBUG=DEBUG,
SECRET_KEY=SECRET_KEY,
ALLOWED_HOSTS=ALLOWED_HOSTS,
ROOT_URLCONF=__name__,
MIDDLEWARE=(
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
),
)
from django.urls import re_path
from django.core.wsgi import get_wsgi_application
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
urlpatterns = (
re_path(r'^$', index),
)
application = get_wsgi_application()
if __name__ == "__main__":
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
其中的secret_key
会在每次新建项目时创建一个随机密码的的默认值,以保障SECRET_KEY
在项目层面是固定的,项目间是随机的。
通过startproject
使用模板,要使用--template
参数,终端命令如下:
django-admin startproject mypro --template=project_name
该命令会创建mypro文件夹,并在其文件夹中创建一个mypro.py文件,在此基础上,扩展其应用。
博文最后更新时间: