概述
作用:视图接收WEB请求并返回WEB响应方法:1. FBV(function base views) 就是在视图里使用函数处理请求。
2. CBV(class base views) 就是在视图里使用类处理请求。
响应: 可以是一个HTML页面,一个重定向,一个404错误、一个JSON数据等等
过程:
URLConf
视图函数
HttpRequest对象
概述: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象; 视图函数的一个形参就是HttpRequest对象
属性
方法
is_ajax(): 如果请求是通过XMLHTTPRequest类发起的,返回True
QueryDict对象
clipboard.png
GET属性
http://127.0.0.1:8000/get1/?a=1&b=2&c=3
def get1(request):
a = request.GET.get("a")
b = request.GET.get("b")
c = request.GET.get("c")
return HttpResponse(a+"-"+b+"-"+c)
http://127.0.0.1:8000/get2/?a=1&a=2&c=3
def get2(request):
alist = request.GET.getlist("a")
c = request.GET.get("c")
return HttpResponse(alist[0]+"-"+alist[1]+"-"+c)
POST属性
使用表单提交,需要将settings.py文件中的'django.middleware.csrf.CsrfViewMiddleware',中间件去掉
或者加上{%csrf_token}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/register/" method="post">
用户名:
<input type="text" name="username" value=""><hr/>
密码:
<input type="password" name="passwd" value=""><hr/>
爱好:
<input type="checkbox" name="hobby" value="power">权利
<input type="checkbox" name="hobby" value="money">金钱
<input type="checkbox" name="hobby" value="book">阅读<hr/>
<input type="submit" value="注册">
</form>
</body>
</html>
#views.py
def register(request):
if request.method == "GET":
return render(request, "register.html")
else:
username = request.POST.get("username")
passwd = request.POST.get("passwd")
hobbys = request.POST.getlist("hobby")
print(username, passwd, hobbys)
return HttpResponse("注册成功")
HttpResponse对象
概述: HttpRequest对象由Django自动创建的,但是HttpResponse对象由程序员创建的;存储服务器响应给客户端的数据
用法
常见的MIME类型(通用型):
- 超文本标记语言文本 .html text/html
- xml文档 .xml text/xml
- XHTML文档 .xhtml application/xhtml+xml
- 普通文本 .txt text/plain
- RTF文本 .rtf application/rtf
- PDF文档 .pdf application/pdf
- Microsoft Word文件 .word application/msword
- PNG图像 .png image/png
- GIF图形 .gif image/gif
- JPEG图形 .jpeg,.jpg image/jpeg
- au声音文件 .au audio/basic
- MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
- RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
- MPEG文件 .mpg,.mpeg video/mpeg
- AVI文件 .avi video/x-msvideo
- GZIP文件 .gz application/x-gzip
- TAR文件 .tar application/x-tar
- 任意的二进制数据 application/octet-stream
属性
属性 | 描述 |
---|---|
content | 表示返回的内容,字符串类型 |
charset | 表示response采用的编码字符集,字符串类型 |
status_code | 响应HTTP的状态码 |
content_type | 指定输出的MIME类型 |
方法
init: 使用页面实例化HttpResponse对象
write(content):
# 以文件的方式写入,将 content 写到报文的主体中,这使得 HttpResponse 的实例类似于文件对象
def index(request):
response = HttpResponse()
response.content = "sunck is a good man"
response.charset = "utf-8"
response.write("!")
response.write("very good!")
return response
flush() : 以文件的方式输出缓冲区; 在flush之后就不要在写write了
set_cookie():
原型:set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)
作用: 设置cookie,cookie是保存在客户端的信息,以键值对的形式保存
参数:
- key : cookie的键
- value:cookie的值
- max_age: 过期时间 单位秒
- expires:设置过期时间 datetime.datetime 对象
示例:
def setcookie(request):
response = HttpResponse("sunck is a handsome man")
response.set_cookie("sunck", "good")
return response
request.COOKIES.get("sunck")
子类HttpResponseRedirect
功能: 重定向,服务器端跳转
实现
from django.http import HttpResponse, HttpResponseRedirect
def indexTemp(request):
# 重定向到/index/
return HttpResponseRedirect("/index/")
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseRedirect
def indexTemp(request):
# 重定向到/index/, HttpResponseRedirect很少用了,一般用redirect
# return HttpResponseRedirect("/index/")
return redirect("/index")
子类JsonResponse
返回JSON数据,一般用于异步请求
优点: 帮助用户创建JSON编码响应; 参数是字典对象,如果传入不是字典格式比如列表,设置参数safe=False;JsonResponse的默认Content-Type为application/json,不需要我们写了。
状态保持
概述
启用session
# settings.py 默认已经启用
'django.contrib.sessions',
'django.contrib.sessions.middleware.SessionMiddleware'
使用session
启用session后,每个HttpRequest对象都将具有一个session属性,它是一个类似字典的对象
方法 | 解释 |
---|---|
get(key, default=None) | 根据键获取会话的值 |
clear() | 清除所有会话 |
flush() | 删除当前的会话并删除会话的cookie |
del request.session[键] | 删除会话 |
示例
def home(request):
userAccount = request.session.get("userAccount", default="未登录")
return render(request, "home.html", {"userAccount":userAccount})
def cart(request):
userAccount = request.session.get("userAccount", default="未登录")
return render(request, "cart.html", {"userAccount":userAccount})
def login(request):
if request.method == "GET":
fromPath = request.GET.get("from")
return render(request, "login.html", {"fromPath":fromPath})
else:
userAccount = request.POST.get("userAccount")
passwd = request.POST.get("passwd")
# 从哪里来
fromPath = request.GET.get("from")
# 验证
if userAccount == "sunck" and passwd == "sunck1999":
#登陆成功
#状态保持,将用户名写入session
request.session["userAccount"] = userAccount
fromPath = "/" + fromPath + "/"
return redirect(fromPath)
else:
#登陆失败
return redirect("/login/?from=%s"%fromPath)
from django.contrib.auth import logout
def quit(request):
logout(request)
return redirect("/home/")
过期时间
存储session
基于数据库的会话: 默认的会话存储方式
SESSION_ENGINE='django.contrib.sessions.backends.db'
基于缓存的会话: 只存在本地内存中,如果丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
数据库用于做持久化,缓存用于提高效率,先去缓存中取数据,缓存没有再去数据库中取,然后在缓存中存一份
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
使用redis缓存session
SESSION_ENGINE='redis_sessions.session'
SESSION_REDIS_HOST='localhost'
SESSION_REDIS_PORT=6379
SESSION_REDIS_DB=0
SESSION_REDIS_PASSWORD=''
SESSION_REDIS_PREFIX='session'
#通过redis-cli客户端可以查看:
127.0.0.1:6379> select 0
OK
127.0.0.1:6379[4]> keys *
1) "session:0bjyuegx0i5ivyuzpb8ezgo0b35u2z4v"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。