Django介绍、工程搭建、配置、静态文件与路由
客户端:发起HTTP请求,接收HTTP响应。
例如:浏览器、ajax请求、爬虫程序(模拟浏览器请求)、app
服务器程序:接收HTTP请求报文、解析HTTP请求报文、构造HTTP响应报文、返回HTTP响应报文
例如:Gunicorn 、uwsgi
框架程序:–HTTP请求对象(request)—中间层(flask中是请求钩子)—具体视图处理、业务处理(模板、表单、数据库)—中间层(flask中是请求钩子)—HTTP响应对象(response)
例如:Flask、Django、Tornado,框架自带的开发服务器并发处理能力不高,所以上线部署需要部署在Gunicorn或uwsgi服务器
2.1重量级**:Django原生提供了众多的功能组件,让开发更简便快速
2.2 MVT:
3.1 安装虚拟环境
mkvirtualenv django_py3_1.11 -p python3
3.2 安装Django
pip install django==1.11.11
3.3 创建工程
django-admin startproject 工程名称
settings.py 是项目的整体配置文件。
urls.py 是项目的URL配置文件。
wsgi.py 是项目与WSGI兼容的Web服务器入口。
manage.py 是项目管理文件,通过它管理项目。
3.5 创建子应用
python manage.py startapp 子应用名称
3.6 子应用目录说明
admin.py 文件跟网站的后台管理站点配置相关。
apps.py 文件用于配置当前子应用的相关信息。
migrations 目录用于存放数据库迁移历史文件。
models.py 文件用户保存数据库模型类。
tests.py 文件用于开发测试用例,编写单元测试。
views.py 文件用于编写Web应用视图代码。
from django.http import HttpResponse
def index(request):
"""
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
"""
return HttpResponse("hello the world!")
视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
3.7 运行开发服务器
python manage.py runserver ip:端口
4.1 在工程配置文件【settings.py】中,【INSTALLED_APPS】列表保存了工程中已经注册安装的子应用,在后面添加:‘子应用名称.apps.(子应用apps里面的类名)’,例如:‘users.apps.UsersConfig’,类似于模块导入格式。
4.2 在子应用中添加【urls.py】文件,用于保存该应用的路由,在【urls.py】文件中定义子应用的路由信息。例如:
from django.conf.urls import url
from . import views
# urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
# 每个路由信息都需要使用url函数来构造
# url(路径, 视图)
url(r'^index/$', views.index),
]
4.3 在工程总路由的【urls.py】中添加子应用的路由数据。
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默认包含的
# r'^users/' 决定了子应用的所有路由都以/users/开头,相当于flask蓝图中的【prefix】前缀
# 使用【include】来将子应用子应用里的全部路由包含进工程路由中
url(r'^users/', include('users.urls')),
# include函数除了可以传递字符串之外,也可以直接传递应用的urls模块
url(r'^users/', include(users.urls)), # 添加应用的路由
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
当前工程的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径。
调试模式,创建工程后初始值为True,即默认工作在调试模式下。
部署线上运行的Django不要运行在调式模式下,记得修改DEBUG=False
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
STATICFILES_DIRS 存放查找静态文件的目录
示例:
1) 在项目根目录下创建static_files目录来保存静态文件。
2) 在demo/settings.py中修改静态文件的两个参数为
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_files'),
]
3)此时在static_files添加的任何静态文件都可以使用网址 /static/文件在static_files中的路径 来访问了。
例如,我们向static_files目录中添加一个index.html文件,在浏览器中就可以使用127.0.0.1:8000/static/index.html来访问。
或者我们在static_files目录中添加了一个子目录和文件goods/detail.html,在浏览器中就可以使用127.0.0.1:8000/static/goods/detail.html来访问。
注意:
Django 仅在调试模式下(DEBUG=True)能对外提供静态文件。
当DEBUG=False工作在生产模式时,Django不再对外提供静态文件,需要是用collectstatic命令来收集静态文件并交由其他静态文件服务器来提供
Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据。
除了上述方式外,也可将工程的全部路由信息都定义在主路由文件中,子应用不再设置urls.py
Django在接收到一个请求时,从主路由文件中的【urlpatterns】列表中以【由上至下】的顺序查找对应路由规则,如果发现规则为【include】包含,则再进入被包含的【urls】中的【urlpatterns】列表【由上至下】进行查询。
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
url(r'^users/', include('users.urls', namespace='users')),
命名空间表示,凡是users.urls中定义的路由,均属于namespace指明的users名下。
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
使用reverse函数,可以根据路由名称,返回具体的路径,如:
from django.core.urlresolvers import reverse # 注意导包路径
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在。如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
]
用户访问 index 或者 index/ 网址,均能访问到index视图。
说明:
虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
是否结尾带/以所属公司定义风格为准。
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。
AppConfig.name 属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。
AppConfig.verbose_name 属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = '用户管理'