接外包,有相关需求的可以联系我:Telegram | Email

Django-视图

该文章创建(更新)于05/31/2022,请注意文章的时效性!

视图

概述

  • 作用:
    • 视图接受web请求,并响应Web请求
  • 本质:
    • 视图就是 一个Python中的函数
  • 响应内容:
    • 网页
      • 重定向
      • 错误视图
        • 404:url找不到
        • 500: 服务器内部错误
    • JSON数据

URL 配置

配置流程

  • settings.py中指定根级URL配置文件:ROOT_URLCONF = 'project.urls',默认实现了。
  • urlpatterns:
    • 一个url实例的对象
    • url对象
      • 正则表达式
      • 视图名称
      • 名称(用来反向解析的)
  • url匹配正则的注意事项:
    • 如果想要从url中获取一个值,需要对正则加小括号
    • 匹配正确,前方不需要加小斜杠/,一般在最后加
    • 正则前需要加r表示字符串转义

    引入其它url配置

  • 一般在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法: url(r'^', include('myApp.urls',namespace='myApp')),

匹配过程

  • 工程url->应用url->视图

URL的反向解析(代理):

  • 概述
    • 如果在视图/模板中使用了硬编码的连接,在url配置发生改变时,动态生成链接的地址。
  • 解决思路
    • 在使用链接时,通过url配置的名称,动态生成url地址。
  • 作用
    • 使用url模板的时候

视图函数

定义视图:

  • 本质:一个函数
  • 视图参数:
    • request 一个HttpRequest的实例
    • 通过url正则表达式获取的参数
  • 位置:
    • 一般在views.py中定义

错误视图

  • 404视图
    • 找不到网页(url匹配不成功)时返回。
    • 可以自己定义。
      • templates下定义404.html
        • request_path:导致出错的网址。
      • 配置settings.py
        • DEBUG 如果为True 永远会调用404.html页面
        • ALLOWED_HOSTS = [*]
  • 500视图
    • 在视图代码中出现错误(服务器代码)。
  • 400视图
    • 错误是客户的操作。

HttpRequest对象

概念

  • 接收HTTP请求后,会根据报文创建HttpRequest对象
  • 视图的第一个参数就是HttpRequest对象
  • Djano对象创建的,之后调用试图传递给视图

属性

  • path
    • 请求的完整路径(不包括域名和端口)
  • method
    • 表示请求的方式,常用的有GET、POST
  • encoding
    • 表示浏览器提交的数据的编码方式,一般为utf-8
  • GET
    • 类似字典的对象,包含了get请求的所有参数
  • POST
    • 类似字典的对象,包含了post请求的所有参数
  • FILES
    • 类似字典的对象,包含了所有上传的文件。
  • COOKIES
    • 字典,包含所有的cookie
  • session
    • 类似字典的对象,表示当前会话

方法

  • is_ajax()
    • 如果是XMLHttpRequest发起的,返回True

QueryDict对象

  • request对象中的GET、POST对象都属于QueryDict对象
  • 方法
    • get()
      • 作用:根据键获取值
      • 只能获取一个值
      • www.baidu.com/abc?a=1&b=2&c=3
    • getlist()
      • 将键的值以列表形式返回
      • 可以获取多个值
      • www.baidu.com/abc?a=1&a=2&c=3 (注意有两个a)

GET属性

# 获取get传递的数据  
def get1(request):  
    a = request.GET.get("a")  
    b = request.GET["b"]  
    c = request.GET.get("c")  
    return  HttpResponse(a + " " + b + " " + c)  

def get2(request):  
    a = request.GET.getlist('a')  
    a1 = a[0]  
    a2 = a[1]  
    b = request.GET.get('c')  
    return HttpResponse(a1 + " " + a2 + " " + b)

POST属性

  • 使用表单模拟提交post请求
  • 关闭CSRF:
MIDDLEWARE = [  
    'django.middleware.security.SecurityMiddleware',  
    'django.contrib.sessions.middleware.SessionMiddleware',  
    'django.middleware.common.CommonMiddleware',  
    # 'django.middleware.csrf.CsrfViewMiddleware',  
    'django.contrib.auth.middleware.AuthenticationMiddleware',  
    'django.contrib.messages.middleware.MessageMiddleware',  
    'django.middleware.clickjacking.XFrameOptionsMiddleware',  
]
  • test case
def showregister(request):  
    name = request.POST.get("username")  
    gender = request.POST.get("gender")  
    age = request.POST.get("age")  
    hobby = request.POST.getlist("hobby") # checkbox  

    info = str("name:\t" + name + "\tgender:" +gender + "\tage:" + age + "\thobby"+ str(hobby))  
    print(info)  

    return  HttpResponse(info)

HttpResponse对象

概述

  • 作用
    • 给浏览器返回数据的
  • HttpRequest对象是由Django创建的,HttpResponse对象由程序员创建。

用法

  • 不调用模板,直接返回数据
return  HttpResponse(info)
  • 调用模板
    • render()返回方法
      • 原型:render(request,templateName[,context])
      • 作用:结合数据和模板,返回完整的HTML页面
      • 参数:
        • request:请求体对象
        • templateName:模板路径
        • context:需要渲染在模板上的数据
    • 属性:
      • content: 返回内容
      • charset: 编码格式
      • statuse_code:响应状态
        • 200
        • 304
        • 404
      • content-type:指定输出的MIME类型 #later
  • 方法
    • init 使用页面内容实例化HttpResponse对象
    • write(content) 以文件的形式写入
    • flush: 以文件的形式输出缓冲区(刷新)
    • set_cookie(key,value="",max_age=None,exprise=None)
    • delete_cookie(key)
      • 删除cookie
      • 如果删除一个不存在的key,就当什么都没发生。
  • 子类HttpResponseRedirect
    • 功能
      • 重定向,服务器跳转
    • 简写
      • redirect(to)
    • to推荐使用反向解析
  • 子类`JSonResponse
    • 返回json数据,一般用于异步请求。(Ajax)
    • __ini__(self,data)
    • data是一个字典
    • 注意:
      • Content-type类型为:applicaiton/json
  • test case

def stupage(request,page):  
    # 0 - 5 , 5 - 10  
    page = int(page)  
    studentsList = Students.stuObj2.all()[(page-1)*5:page*5]  
    return render(request, 'myApp/students.html', {'students': studentsList})
def cookieset(request):  
    res = HttpResponse()  
    # res.write("setcookies")  
    cookie = res.set_cookie("name", "emperinter") #设置  
    return res  

def getcookie(request):  
    res = HttpResponse()  
    cookie = request.COOKIES  
    res.write("<h1>" + cookie["name"] + "</h1>")  
    return res
from django.shortcuts import redirect  
from django.http import HttpResponseRedirect  

# 重定向  
def redirect1(request):  
    # return HttpResponseRedirect("/redirect2/")  
    return redirect("/redirect2/")  

def redirect2(request):  
    return HttpResponse("我是重定向后的视图")

SESSION状态保持

概述

  • HTTP协议是无状态的,每次请求都是一次新的请求,不记得以前的请求;
  • 客户端与服务器端的一次通信就是一次会话;
  • 想实现状态保持,需要在客户端或服务器端存储有关会话的数据
  • 存储方式
    • cookie
      • 所有的数据都在客户端,要存储敏感的数据
      • 不安全/数据量小
    • session
      • 所有的数据在服务器端,在客户端用cookie存储session_id
  • 状态保持目的
    • 在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
  • 注意
    • 不同的请求者之间不会共享这个数据,与请求者是一一对应的。

启用SESSION

  • settings.py中启动,默认是启用的
INSTALLED_APPS = [  
    'django.contrib.admin',  
    'django.contrib.auth',  
    'django.contrib.contenttypes',  
    'django.contrib.sessions', # session配置  
    'django.contrib.messages',  
    'django.contrib.staticfiles',  
    'myApp',   
]  

MIDDLEWARE = [  
    'django.middleware.security.SecurityMiddleware',  
    'django.contrib.sessions.middleware.SessionMiddleware', # session配置  
    'django.middleware.common.CommonMiddleware',  
    # 'django.middleware.csrf.CsrfViewMiddleware',  
    'django.contrib.auth.middleware.AuthenticationMiddleware',  
    'django.contrib.messages.middleware.MessageMiddleware',  
    'django.middleware.clickjacking.XFrameOptionsMiddleware',  
]

使用SESSION

  • 启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字段的对象;
  • 方法
    • get(key,default=None) 根据键获取session值
    • clear() 清空所有的会话
    • flush() 删除当前的会话并删除会话的cookie
    • 设置过期时间
      • set_expiry(value)
      • 如果不设置,默认两个星期后过期
      • value
        • 整数,单位为秒
        • 时间对象
        • 0 :关闭浏览器时失效
        • None :永不过期
  • 使用redis存储缓存
    • 安装pip install django-redis-sessions
    • seetings.py中配置
SESSION_ENGINE = 'redis_sessions.session'  
SESSION_CACHE_ALIAS = 'default'  
SESSION_REDIS_HOST = 'localhost'  
SESSION_REDIS_PORT = 6379  
SESSION_REDIS_DB = 0  
SESSION_REDIS_PASSWORD = None  
SESSION_REDIS_PREFIX = 'session'
def main(request):  
    username = request.session.get("username","游客") # 获取session,后面是默认值  
    return render(request, 'myApp/main.html', {"username":username})  

def login(request):  
    return render(request, 'myApp/login.html')  

def showmain(request):  
    username = request.POST.get("username")  
    password = request.POST.get("password")  
    # save in session  
    request.session["username"] = username  
    request.session.set_expiry(10) # 设置session过期时间  
    return redirect("/main/")  

from django.contrib.auth import logout  
def quit(request):  
    logout(request) # 清除当前登录,推荐使用  
    # del session  
    # del request.session["username"]  
    # request.session.flush() # 清除所有session  
    # request.session.clear() # 清除所有session  

    return redirect("/main/")


👇 Share | 分享 👇


要不赞赏一下?

微信
支付宝
PayPal
Bitcoin

版权声明 | Copyright

除非特别说明,本博客所有作品均采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明转自-
https://www.emperinter.info/2022/05/31/django-view/


要不聊聊?

我相信你准备留下的内容是经过思考的!【勾选防爬虫,未勾选无法留言】

*

*



微信公众号

👉 NewsLetter ❤️ 邮箱订阅 👈

优惠码


阿里云国际版20美元
Vultr10美元
搬瓦工 | Bandwagon应该有折扣吧?
域名 | namesiloemperinter(1美元)