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

Django-视图

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

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

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

  • 一般在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法: url(r'^', include('myApp.urls',namespace='myApp')),
    • 工程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视图
      • 错误是客户的操作。

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

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

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

    • 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传递的数据  
    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请求
    • 关闭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)
    

    • 作用
      • 给浏览器返回数据的
    • 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("我是重定向后的视图")
    

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

    • 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后,每个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/")
    


    要不赞赏一下?

    微信
    支付宝
    PayPal
    Bitcoin

    版权声明 | Copyright

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


    要不聊聊?

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

    *

    *



    YouTube | B站

    微信公众号

    优惠码

    阿里云国际版20美元
    Vultr10美元
    搬瓦工 | Bandwagon应该有折扣吧?
    Just My SocksJMS9272283 【注意手动复制去跳转】
    域名 | namesiloemperinter(1美元)
    币安 币安