概述
作用:视图接收WEB请求并返回WEB响应本质: 视图就是一个python函数,被定义在views.py文件中
响应: 可以是一个HTML页面,一个重定向,一个404错误、一个JSON数据等等
过程:
URLConf
视图函数
HttpRequest对象
概述: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象; 视图函数的一个形参就是HttpRequest对象
属性
方法
is_ajax(): 如果请求是通过XMLHTTPRequest类发起的,返回True
QueryDict对象
GET属性
: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)
: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',中间件去掉
注册
def registe(request): if request.method == "GET": return render(request, "registe.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 responserequest.COOKIES.get("sunck")
delete_cookie(key):删除cookie
子类HttpResponseRedirect
功能: 重定向,服务器端跳转
实现
from django.http import HttpResponse, HttpResponseRedirectdef indexTemp(request): # 重定向到/index/ return HttpResponseRedirect("/index/")from django.shortcuts import render, redirectfrom django.http import HttpResponse, HttpResponseRedirectdef indexTemp(request): # 重定向到/index/ # return HttpResponseRedirect("/index/") return redirect("/index")
子类JsonResponse
返回JSON数据,一般用于异步请求
优点: 帮助用户创建JSON编码响应; 参数是字典对象;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 logoutdef 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=6379SESSION_REDIS_DB=0SESSION_REDIS_PASSWORD='sunck'SESSION_REDIS_PREFIX='session'