Django day01
1.web应用程序处理流程:
服务器程序:
主要就是接收http报文,进行解析
框架程序:
根据解析好的报文,进行处理,实现业务处理(视图)
中间层:
2.Django
**主要目的:**简便,快速开发数据库驱动。代码复用
**特点:**重量级框架:原生提供众多的功能组件。
MVT模式:
模型 数据库 模板
- M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
- V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
- T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
mvc模式说明:
- M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
- V全拼为View,用于封装结果,生成页面展示的html内容。
- C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
工程搭建:
1.环境的安装:
安装虚拟环境,
mkvirtualenv django_py3_1.11 -p python3
安装Django:注意一定要指定好版本
创建工程:
创建工程,推荐在命令行中使用命令来创建,使用pycham来进行创建,在很多时候,会给配置很多东西,从而造成上线时候出现未知的问题。
创建工程的命令为:
django-admin startproject 工程名称
工程目录的结构:
setting.py :是项目的整体配置文件:比如 DEBUG 的开关,静态文件的位置等等。
urls.py 是项目的URL配置文件。
wsgi.py 是项目与WSGI兼容的Web服务器入口。
manage.py 是项目管理文件,通过它管理项目。
运行开发服务器:
运行服务器命令如下:
python manage.py runserver ip:端口
或:
python manage.py runserver
创建子应用:
创建子应用的命令
python manage.py startapp 子应用名称
子项目结构
admin.py 文件跟网站的后台管理站点配置相关。
apps.py 文件用于配置当前子应用的相关信息。
migrations 目录用于存放数据库迁移历史文件。
models.py 文件用户保存数据库模型类。
tests.py 文件用于开发测试用例,编写单元测试。
views.py 文件用于编写Web应用视图。
注册安装子应用:
在setting.py中的,将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。
创建视图:
-
创建
打开刚创建的users模块,在views.py中编写视图代码。from django.http import HttpResponse
def index(request):
“”"
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
“”"
return HttpResponse(“hello the world!”)
说明:
视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
2. 定义路由URL
-
在子应用中新建一个urls.py文件用于保存该应用的路由。
-
在users/urls.py文件中定义路由信息。
from django.conf.urls import url
from . import views
#urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
# 每个路由信息都需要使用url函数来构造
# url(路径, 视图)
url(r’^index/$’, views.index),
] -
在工程总路由demo/urls.py中添加子应用的路由数据。
from django.conf.urls import url, include from django.contrib import admin
urlpatterns = [
url(r’^admin/’, admin.site.urls), # django默认包含的#添加
url(r’^users/’, include(‘users.urls’)),
]
使用include来将子应用users里的全部路由包含进工程路由中;
r’^users/’ 决定了users子应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完整访问路径为/users/index/。
include函数除了可以传递字符串之外,也可以直接传递应用的urls模块,如
from django.conf.urls import url, include
from django.contrib import admin
import users.urls # 先导入应用的urls模块
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^users/', include('users.urls')),
url(r'^users/', include(users.urls)), # 添加应用的路由
]
-
启动运行
重新启动django程序python manage.py runserver
在浏览器中输入网址127.0.0.1:8000/users/index/ 可看到返回的信息
配置,静态文件与路由
配置文件:
1. BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
当前工程的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径。
2.DEBUG:
初始值为True:修改代码文件后,程序会自动重启
若程序出现问题,则会在前端显示问题和代码
3.语言和时间
Django支持本地化处理
语言和时区修改为*信息
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
静态文件:
需要配置两个参数:
STATICFILES_DIRS 存放查找静态文件的目录
STATIC_URL 访问静态文件的URL前缀
注意
Django 仅在调试模式下(DEBUG=True)能对外提供静态文件。
当DEBUG=False工作在生产模式时,Django不再对外提供静态文件,需要是用collectstatic命令来收集静态文件并交由其他静态文件服务器来提供。
5.路由
1.路由的路径
Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据。主路由
当然也可直接放在主路由文件中,但不提倡
2.解析顺序:自上而下
提示:
需要注意定义路由的顺序,避免出现屏蔽效应。
3.命名
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
-
在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
url(r’^users/’, include(‘users.urls’, namespace=‘users’)),
命名空间表示,凡是users.urls中定义的路由,均属于namespace指明的users名下。
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
2) 在定义普通路由时,可以使用name参数指明路由的名字,如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
reverse反解析
作用:1 生成路由地址规范
2 不修改引用路由地址的代码
使用reverse函数,可以根据路由名称,返回具体的路径,如:
from django.urls import reverse # 注意导包路径
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
对于未指明namespace的,reverse(路由name)
对于指明namespace的,reverse(命名空间namespace:路由name)
路径结尾斜线/的说明
Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在。如
urlpatterns = [
url(r’^index/$’, views.index, name=‘index’),
]
用户访问 index 或者 index/ 网址,均能访问到index视图。
说明:
虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
是否结尾带/以所属公司定义风格为准。
请求
回想一下,利用HTTP协议向服务器传参有几种途径?
提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
查询字符串(query string),形如key1=value1&key2=value2;
请求体(body)中发送的数据,比如表单数据、json、xml;
在http报文的头(header)中。
URL路径参数