视图层

发布时间 2023-08-01 21:51:26作者: Maverick-Lucky

三板斧问题

在视图函数中写函数跟普通函数不太一样。

 djagno中使用的局部的request:

urls文件:

url('index/',views.index),

views文件:

def index(request):
    pass

报错:

 所有的视图函数不能够没有返回值,并且返回值必须是HttpResponse对象

其实三板斧方法返回的都是HttpResponse对象

# 在urls文件中:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('index/',views.index),
]

# 在views文件中:
def index(request):
    # return render(request,'index.html')
    # return HttpResponse('index')  # 返回字符串,源码就是HttpResponse类,加括号就得到实例化对象
    # 追代码----》点进去这个方法去看源码
    # return render(request, "index.html", context={}) #context=None 分配模版变量的
    return redirect(request, "index.html", context={}) #redirect:重定向

 

下图是源码:

render:返回html页面,返回值是HttpResponse对象

正常返回页面:

 redirect:重定向 ,返回也是HttpResponse对象

在flask中request使用的是全局的request

from ... import request

def index():

   pass

def func():

  pass

所有的视图函数都使用全局的request对象,是不会乱套的,具体需要查看源码。

JsonResponse序列化

json格式的数据:主要就是实现跨语言数据传输

序列:字符串

序列化:把其他数据类型转为字符传的过程

反序列化:把字符串转为其他数据类型的过程

现在现跨语言数据的传输使用的都是json,在以前使用的是xml。

但是微信支付朝微信的厚点发送参数的时候,使用的就是xml

json格式的数据特点:{"username":"kevin","age":18},打印的结果也是双引号,而字典书写时使用双引号,但是打印的结果还是单引号。

在json中序列化:

import json
#序列化
json.dumps
#反序列化
json.loads

在js中的序列化:(在前端中)

JSON.stringify()  # 序列化
JSON.parse()  # 反序列化,结果是对象 js中的对象:obj = {}

在django中的序列化:

方法1:(原始方法序列化)

  序列化(明显特征是单引号变双引号了):

import json
def ab_json(request):
    user_dict = {'username':'123','password':'123'}
    json_str = json.dumps(user_dict)
    return HttpResponse(json_str)

结果:

 当序列化加上中文时,编码也需要改变

未修改编码前:

 修改编码后:

 方法2:Django提供的方式(改源码)

 结果如图:

 字典可以序列化,列表也可以序列化:

这样写的话会报错,看报错信息进行修改

 报错信息:

 加了safe修改后:

 结果如图:

 

form表单上传文件

form表单上传文件的前提:

  1. 请求方式必须是post

  2. enctype必须是form-data

当出现这个页面的时候就是未注释配置文件

 将圈起的部分注释掉:

 前端写法:

 后端写法:

 request对象的其他几个方法

request.GET
request.POST
request.FILES
request.methods

request.path_info     # /ab_request/
reqeust.path        # /ab_request/
request.get_full_path()   # /ab_request/ /ab_request/?username=kevin&age=11

上面两个只能拿到路由,没办法拿到路由的参数,下面的既能拿到路由,也能拿到参数。

C(class)BV的书写和F(function)BV的写法

目前写的都是FBV:function based view 基于函数的视图

在视图文件中书写类 CBV:class based view 基于类的视图

postman的官网地址:https://www.postman.com/downloads/
apizza的官网地址:http://www.apizza.net/

好处在于可以很方便的判断是post还是get,并跳转到相应位置

cbv:

视图写法:

from django.views import View
class MyLogin(VIew):
    def get(self,request):
        return render(request,'form.html')
    def post(self,request):
        return HttpResponse('post方法')

 路由写法:

 CBV 的特点是能够根据请求方式的不同直接匹配到对应的方法执行。

CBV源码分析

查看源码时,提醒自己面对对象的查找顺序(先从对象中找,再从产生对象的类里去找,在从父类里去找)

CBV的入口:

 类名可以调用的方法:

  1. 方法被@classmethod装饰器修饰的方法

    类名来调用类方法有什么好处:会把第一个类名自动当成第一个参数传递给方法的第一个形参cls

      对象调用方法把对象自己当成第一个参数传给方法的第一个形参

   2. 被@staticmethod装饰器修饰的方法

 当请求来的时候,开始匹配路由login,就会调用View.view()