Django(6) - 视图

视图

概述:

  • 作用:视图接收web请求,并响应web请求
  • 本质:视图就是python中的一个函数
  • 响应:
    • 响应过程:
      用户在浏览器中输入网址www.sunck.wang/sunck/index.html
      —网址—>
      django获取网址信息,去掉IP与端口号,网址变成:sunck/index.html
      —虚拟路径与文件名—>
      url管理器逐个匹配urlconf,记录视图函数
      —视图函数名—>
      视图管理,找到对应的视图去执行,返回结果给浏览器
      —响应的数据—>
      返回第一步:用户在浏览器中输入网址

    • 网页
      重定向
      错误视图
      404视图:找不到网页(url匹配不成功时返回)时返回
      在templates目录下定义404.html

      <!doctype html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta name="viewport"
      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      </head>
      <body>
      <h1>页面丢失</h1>
      <h2>{{request_path}}</h2>
      </body>
      </html>
      

      request_path:导致错误的网址
      配置settings.py
      DEBUG
      如果为 True,永远不会调用404页面,需要调整为 False 才会显示
      ALLOWED_HOSTS = [’*’]
      500视图:在视图代码中出现错误(服务器代码错误)
      400视图:错误出现在客户的操作
      JSON数据

url配置

  • 配置流程:
    制定根级url配置文件
    settings.py文件中的ROOT_URLCONF
    ROOT_URLCONF = ‘project.urls’
    默认实现了
    urlpatterns
    一个url实例的列表
    url对象
    正则表达式
    视图名称
    名称
    url匹配正则的注意事项
    如果想要从url中获取一个值,需要对正则加小括号
    匹配正则前方不需要加’/’
    正则前需要加’r’表示字符串不转义
  • 引入其他url配置
    在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py中使用include方法
    project\urls.py
    from django.contrib import admin
    from django.conf.urls import url,include
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('myApp.urls', namespace="myAPP")),
    ]
    myApp\urls.py
    from django.urls import path, include
    from django.conf.urls import url
    from . import views
    urlpatterns = [
    url(r'^$', views.index, name="index"),
    ]
    
  • url的反向解析
    概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
    解决:在使用链接时,通过url配置的名称,动态生成url地址
    作用:使用url模板
    {{url ‘web-scope-name’ v1 v2}}

视图函数

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

HttpRequest对象

  • 概述:
    服务器接收http请求后,会根据报文创建HttpRequest对象
    视图的第一个参数就是HttpRequest对象
    django创建的,之后调用视图时传递给视图

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

  • 方法
    is_ajax():如果是通过XMLHttpRequest发起的,返回 True ###ajax请求的一般都会json数据

  • QueryDict对象
    request对象中的GET,POST都属于QueryDict对象
    方法:

    • get():
      根据键获取值,只能获取一个值
      www.sunck.wang/abc?a=1&b=2&c=3
    • getlist()
      将键的值以列表的形式返回
      可以获取多个值
      www.sunck.wang/abc?a=1&b=2&c=3
  • GET属性
    获取浏览器传递过来数据
    get形式:www.mydjango.com/abc?a=1&b=2&c=3
    urls.py

    url(r'^get1', views.get1),   #结尾不能加$,否则无法匹配
    

    views.py

    def get1(request):
    	a = request.GET.get('a')
    	b = request.GET.get('b')
    	c = request.GET.get('c')
    	return HttpResponse(a + " " + b + " " + c)
    

    get形式:www.mydjango.com/abc?a=1&a=2&c=3
    urls.py:

    url(r'^get2', views.get2),
    

    views.py

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

    • 使用表单模拟POST请求
      关闭CSRF:project\project\settings.py
      延伸:CSRF:Cross Site Request Forgery, 跨站点伪造请求—是一种安全防御机制,在站点中防止他人利用cookie和伪造链接达成通话的一种验证方式,在中间件(middleware)关闭CSRF验证是一种方式,但是这不安全,另外一种解决方式是在网页中加入csrf_token标签::{% csrf_token %}
      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',
      ]
      
      示例:
      def showregist(request):
      	return render(request, 'myApp/regist.html',)
      
      def regist(request):
      	name = request.POST.get("name")
      	gender = request.POST.get("gender")
      	age = request.POST.get("age")
      	hobby = request.POST.getlist("hobby")
      	print(name)
      	print(gender)
      	print(age)
      	print(hobby)
      	return HttpResponse("regist")
      
    • 路径:
      url(r'^showregist/$', views.showregist),
      url(r'^showregist/regist/$', views.regist),
      
    • 页面:
      <!doctype html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta name="viewport"
      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>注册</title>
      </head>
      <body>
      <form action="regist/" method="post">
      姓名:<input type="text" name="name" value=""/>
      <hr>
      性别:<input type="radio" name="gender" value="1"><input type="radio" name="gender" value="0"><hr>
      爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
      <hr>
      <input type="submit" value="注册">
      </form>
      </body>
      </html>
      

HttpResponse对象

  • 概述:
    作用:给浏览器返回数据
    HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建
  • 用法:
    不用模板,直接返回数据
    语句示例:return HttpResponse(“Sunck is a good man”)
    调用模板
    使用render方法
    原型:render(request, templateName[, context])
    作用:结合数据和模板,返回一个完整的HTML页面
    参数:
    request:请求体对象
    templateName:模板路径
    context:传递给需要渲染在模板上的数据,字典dict类型
  • 属性
    content:表示返回内容
    charset:编码格式
    status_code:响应状态码
    200
    304
    404
    400
    content-type:指定输出的MIME类型
  • 方法
    • init:使用页面内容实例化HttpResponse对象

    • write(content):以文件的形式写入

    • flush():以文件的形式输出缓冲区

    • set_cookie(key, value, maxAge=None, exprise=None):设置cookie

    • delete_cookie(key):删除cookie
      如果删除一个不存在的cookie,就当什么都没发生

  • 子类HttpResponseRedirect
    功能:重定向,服务器端的跳转
    简写:redirect(to)
    to推荐使用反向解析
    示例:
    from django.http import HttpResponseRedirect
    from django.shortcuts import redirect
    def redirect1(request):
    # return HttpResponseRedirect('/redirect2')
    return redirect('/redirect2')
    def redirect2(request):
    return HttpResponse("我是重定向后的视图")
    
  • 子类JsonResponse
    返回Json数据,一般用于异步请求----ajax异步请求
    init(self.data)
    data 字典
    注意:Content-type类型为application/json

状态保持

  • 概论
    http协议是无状态的,每次请求都是一次新的请求,它不记得之前的请求。客户端与服务器的一次通信就是一次会话实现状态的保持,在客户端或服务端存储有关会话的数据。
    存储的方式

    1. cookie:所有数据存储在客户端,不要存储敏感的数据
    2. session:所有的数据存储在服务端,在客户端用cookie存储session_id

    状态保持的目的:
    在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
    注意:不同的请求者之间不会共享这个数据,与请求者一一对应

  • 启用session:
    project\project\settings.py中添加:

    INSTALLED_APPS    'django.contrib.sessions',
    MIDDLEWARE    'django.contrib.sessions.middleware.SessionMiddleware',
    
  • 使用session
    启用session后,每个httpRequest对象都有一个session属性
    获取:get[key, default=None] 根据键获取session值
    清除:

    1. from django.contrib.auth import logout
      logout(session) ###推荐使用

    2. clear() 清空所有会话

    3. flush() 删除当前会话并删除会话的cookie

    示例:

    # session
    def main(request):
    	# 取session
    	username = request.session.get('name', '游客')
    	print(username)
    	return render(request, 'myApp/main.html', {'username': username})
    	
    def login(request):
    	return render(request, 'myApp/login.html')
    	
    def showmain(request):
    	print("*****************")
    	username = request.POST.get('username')
    	# 存储session
    	request.session['name'] = username
    	return redirect('/main/')
    
    from django.contrib.auth import logout
    def quit(request):
    	# 清除session
    	logout(request) # 方法1,推荐
    	# request.session.clear() # 方法2
    	request.session.flush() # 方法3
    	return redirect('/main/')
    
  • 设置session过期时间
    set_expiry(value)
    request.session.set_expiry(10) 设置为10秒后过期
    如果不设置,2个星期后过期
    value设置为0代表关闭浏览器时过期
    value设置为None代表设置永不过期,不推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值