1

概述

作用:视图接收WEB请求并返回WEB响应

方法:1. FBV(function base views) 就是在视图里使用函数处理请求。

​ 2. CBV(class base views) 就是在视图里使用类处理请求。

响应: 可以是一个HTML页面,一个重定向,一个404错误、一个JSON数据等等

过程:

clipboard.png

URLConf

clipboard.png

视图函数

clipboard.png

HttpRequest对象

概述: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象; 视图函数的一个形参就是HttpRequest对象

属性

clipboard.png

方法

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对象由程序员创建的;存储服务器响应给客户端的数据

用法

clipboard.png

常见的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,不需要我们写了。

状态保持

概述

clipboard.png

启用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/")

过期时间

clipboard.png

存储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"

rayzz
145 声望13 粉丝