安装Django
pip3 install django==2.2.5
检查是否安装Django
pip3 freeze|grep -i 'Django'
创建工程
django-admin startproject +名称
如:django-admin startproject bookmanager
进入bookmanager目录运行django
运行python:
python manage.py runserver
查看django进程id
lsof -i:8000
项目结构-共有配置settings.py
BASE_DIR
用于绑定当前项目的绝对路径(动态计算出来的),所有文件夹都可以依赖此路径
DEBUG
用于配置Django项目的启动模式,取值:
True 表示开发环境中使用开发调试模式(用于开发中)
False 表示当前项目运行在生产环境中
ALLOWED_HOSTS
设置允许访问到本项目的host头值
空列表,表示只有请求头中host为127.0.0,localhost能访问本项目 - DEBUG = True时有效
[*"],表示任何请求头的host都能访问到当前项目
[192.168.1.3','127.0.0.1']表示只有当前两个host头的值能访问当前项目
INSTALLED_ APPS #指定当前项目中安装的应用列表
MIDDLEWARE #用于注册中间件
TEMPLATES #用于指定模板的配置信息
DATABASES #用于指定数据库的配置信息
指定语言
LANGUAGE CODE -用于指定语言配置
英文: "en-us"
中文: "zh-Hans '
时区配置:
TIME_ZONE #用于指定当前服务器端时区
世界标准时间: "UTC"
中国时区: "Asia/Shanghai"
ROOT_URLCONF #用于配置主url配置 'mysite1.urls'.
ROOT URLCONF = 'mysite1.urls'
视图函数
用于接收一个浏览器请求(HttpRequest对象)并通过HttpResponse对象返回相应的的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容个给浏览器
路由配置-path
path()函数
导入 - from django.urls import path
语法 - path(route,views,name=Node)
参数:
1.route:字符串类型,匹配的请求路径
2.views:指定路径所对应的视图处理函数的名称
3.name:为地址起别名,在模板中地址反向解析时使用
路由配置-转换器
path转换器
语法:<转换器类型:自定义名>
作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
例子:
#定义类型和参数,在网页上浏览时传参
urls.py
path('page/<int:pg>',views.pagon_view),
views.py
from django.http import HttpResponse
def pagon_view(request,pg):
html = '这是编号为%s的网页'%(pg)
return HttpResponse(html)
例子2:定义小计算器
定义格式:ip:端口号/整数/操作字符串/[add/sub/mul]/整数
从路由中提取数据,做相应的操作后返回给浏览器
实现目标
输入:ip:port/100/add/200
页面显示结果:300
path('<int:n>/<str:op>/<int:m>',views.cal_views),
def cal_views(request,n,op,m):
if op not in ['add','sub','mul']:
return HttpResponse('你的操作错误,请输入:add、sub或者mul')
#判断用户输入
result = 0
if op == 'add':
result = n + m
elif op == 'sub':
result = n - m
elif op == 'mul':
result = n * m
# 返回最终结果
return HttpResponse('结果为:%s'%(result))
路由配置 - re_path()
re_path()函数
在url的匹配过程中可以使用正则表达式进行精确匹配
语法:
re_path(reg,view,name=xxx)
正则表达式为命名分组模式(?P<name>pattern);匹配提取参数后用关键字传参方式传递给视图函数。
#urls
# ip:端口号/整数2/操作字符串/[add/sub/mul]/整数2
re_path(r'^(?P<x>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,2})$',views.cal2_view),
#view
def cal2_view(request,x,op,y):
html = 'x:%s op:%s y:%s'%(x,op,y)
return HttpResponse(html)
案例:输出生日为:xxxx年xx月xx日
#urls.py
# #http://192.168.40.135:8000/birthday/年4/月2/日2
re_path(r'^birthday/(?P<y>\d{4})/(?P<m>\d{1,2})/(?P<d>\d{1,2})$',
views.birthday_view),
# #http://192.168.40.135:8000/birthday/月2/日2/年4
re_path(r'^birthday/(?P<m>\d{1,2})/(?P<d>\d{1,2})/(?P<y>\d{4})$',
views.birthday_view)
#view.py
def birthday_view(request,y,m,d):
html = "生日为%s年%s月%s日"%(y,m,d)
return HttpResponse(html)
请求和响应
定义:
请求:是指浏览器端通过HTTP协议发送给服务器端的数据
响应:是指服务器端接收到请求后做相应的处理后在回复给浏览器端的数据
请求方法
Django中的请求
请求在Django中实则就是视图函数的第一个参数,即HttpRequest对象
Django接收到http协议的请求后,会根据请求数据报文创建HttpRequest对象
HttpRequest对象 通过属性 描述了 请求的所有相关信息。
path_info:URL字符串method:字符串,表示HTTP请求方法,常用值:‘GET’、'POST'GET:QueryDict查询字典对象,包含get请求方式的所有数据POST:QueryDict查询字典的对象,包含post请求方式的所有数据FILES:类似于字典的对象,包含所有的上传文件信息COKIES:python字典,包含所有的cookie,键和值都为字符串session:似于字典的对象,表示当前的会话body:字符串,请求体的内容(POST或PUT)scheme:请求协议('http'/'https')request.get_full_path():请求的完整路径request.META:请求中的元数据(消息头)-reques.META['REMOTE_ADDR']:客户端IP地址
示例:
def test_request(request):
print('path info is',request.path_info)
print('method is ',request.method)
print('querystring is',request.GET)
print('full path is', request.get_full_path())
return HttpResponse('test request ok')
常见的HTTP
响应
状态码
200 #请求成功301 #永久重定向-资源(网页等)被永久转移到其他URL302 #临时重定向404 #请求的资源(网页等)不存在500 #内部服务器错误
Django中的响应对象
构造函数格式:
HttpResponse(content=响应体,content_type=响应体数据类型,status=状态码)
作用:
向客户端浏览器返回响应,同时携带响应体内容
常见的Content-Type如下:
重定向到另一个路由
return
HttpResponseRedirect
(
'/page/1'
)
GET请求和POST请求
定义
无论是GET还是POST,统一都由视图函数接收请求,通过判断request.method区分具体的请求动作
def test_get_post(request):
if request.method == 'GET':
pass
elif request.method == 'POST':
#处理用户提交的数据
pass
else:
pass
return HttpResponse('--test get post is ok--')
GET处理
GET请求动作,一般用于向服务器获取数据
能够产生GET请求的场景:
-浏览器地址栏中输入URL,回车后-<a href="地址?参数=值&参数=值">-form表单中的method为get
GET请求方式中如果有数据需要传递给服务器,通常会用查询字符串(Query String)传递
POST处理
POST请求动作,一般用于向服务器提交大量/隐私数据客户端通过表单等POST请求将数据传递给服务端
例如:
使用post方式接收客户端数据
取消csrf验证,否则Django将会拒绝客户端发来的POST请求,报403响应
如何取消csrf验证
-禁止掉settings.py中MIDDLEWARE中的CsrfViewsMiddleWare的中间件MIDDLEWARE = [.....#'django.middleware.csrf.CsrfViewMiddleware',....]