基本的注册和创建流程
- 虚拟环境将版本,包,文件进行隔离
- 安装django包不要加sudo,否则会安装在本地
- 创建流程
1.创建工程
2.创建应用
3.定义视图(在view.py中定义视图函数,参数为请求对象,返回响应对象)
4.定义路由(主路由到子路由,由上至下进行匹配,注意:$不能用在主路由中,否则无法匹配到子路由)
配置文件中的BASE_DIR是一个动态的文件绝对路径 - 注册APP---设置路由(总和子)---定义视图函数
请求Request
- HTTP协议向服务器传参的途径
- 提取URL中的特定部分.如/beijing/2018,在服务器端的路由中用正则表达式截取.
- 查询字符串(query string).URL中路径后面?key1=value1&key2=value2.
- 请求体(body)中发送的数据.比如表单数据、json、xml。
- 在http报文的头(header)中。
- URL路径参数
定义路由URL时,使用正则表达式提取参数的方法,从URL中获取请求参数,Django将提取的参数传递给视图函数的传入参数。
在路由地址中,用分组(正则表达式)设置url地址要传递的参数
url(r'users/index/(?P<param2>\d+)/(?P<param1>/w*)', views.index)
- 未命名按照参数定义顺序传递(浏览器访问/.../..../.../....)
urls中正则匹配 - 命名参数按照参数名称传递(浏览器访问?key1=value1&key2=value2)
传参不按照位置,给正则命名?P<命名> - 在views.py中 获取参数
视图函数中使用request.GET这个属性得到所有请求的字符串,返回类型QueryDict(支持一键多值,[]/get()和getlist()获取请求参数
- Post请求
- 发送请求体数据的请求方式有POST、PUT(全字段携带修改)、PATCH(特定字段修改)、DELETE,
- Django默认开启了CSRF防护,在settings.py文件中注释掉CSRF中间件
- post请求的请求体发送form表单数据(post请求)
视图函数中使用request.POST这个属性得到POST请求的请求体的表单数据,返回类型QueryDict(支持一键多值)
[]/get()和getlist()获取请求参数 - post请求的请求体发送非form表单数据(Json/str/xml)
视图函数中使用request.body这个属性得到POST请求的请求体的非表单数据,返回类型Bytes, 用loads将Json的str转成dict
以上3和4,用postman发送post请求(浏览器不支持POST请求)
- header头
- request.META属性获取请求头headers中的数据,request.META为字典类型
请求头如下:
CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).
- 其他HttpRequest对象属性
method:字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象。
path:字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:字符串,表示提交的数据的编码方式,使用浏览器的默认设置,一般为utf-8,通过修改它来修改访问表单数据使用的编码,对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。
响应Response
- 视图在接收请求并处理后,必须返回HttpResponse对象或子对象
- HttpRequest对象由Django创建,HttpResponse对象由开发人员创建
- 使用django.http.HttpResponse来构造响应对象
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
- 通过HttpResponse对象属性来设置响应体、状态码
content:表示返回的内容。
status_code:返回的HTTP响应状态码
#响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置
response = HttpResponse()
response['Itcast'] = 'Python' # 自定义响应头Itcast, 值为Python
- HttpResponse子类,快速设置状态码,django对状态码进行了封装
HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500
JsonResponse
返回json数据,可以使用JsonResponse来构造响应对象,作用:
1.数据转换为json字符串
2.设置响应头Content-Type为 application/jsonredirect重定向
from django.shortcuts import redirect
def demo_view(request):
return redirect('/index.html')
Cookie
- 由服务器端生成,存储在客户端,
- Cookie以键值对Key-Value存储信息。
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
- 设置Cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('itcast1', 'python1') # 临时cookie
response.set_cookie('itcast2', 'python2', max_age=3600) # 有效期一小时
return response
- 获取Cookie
通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值,request.COOKIES为字典类型
def demo_view(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
Session
-称为会话控制,Session 对象存储特定用户会话所需的属性及配置信息,是存储用户的首选,session在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问,保持会话状态。
-存储在服务器端(为解决session共享问题,通常存储在数据库,为了效率,选Redis)
- 依赖cookies(服务器在响应浏览器时,返回cookie,带有sessionid)
- 启用Session
Django项目默认启用Session,settings.py文件中将session中间件注释即可禁用Session - 存储方式
settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。
- 数据库
存储在数据库中,这是默认存储方式,在项INSTALLED_APPS中安装
SESSION_ENGINE='django.contrib.sessions.backends.db'
操作Session包括三个数据:键,值,过期时间
- 本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
- 混合存储
优先从本机内存中存取,如果没有则从数据库中存取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
Redis
- 在redis中保存session,需要引入第三方扩展,使用django-redis
pip install django-redis #安装扩展
#setting.py中设置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Session的操作
通过HttpRequest对象的session属性进行会话的读写操作
request.session['键']=值 #以键值对的格式写session
request.session.get('键',默认值) #根据键读取值
request.session.clear() #清除所有session,在存储中删除值部分
request.session.flush() #清除session数据,在存储中删除session的整条数据
del request.session['键'] #删除session中的指定键及值,在存储中只删除某个键及对应的值
request.session.set_expiry(value) #设置session有效期
关于有效期:
value为整数,session在value秒没有活动后过期。
value为0,用户session的Cookie在用户的浏览器关闭时过期。
value为None,session有效期采用系统默认值(两周),在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。