三板斧问题
在视图函数中写函数跟普通函数不太一样。
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()
标签:index,request,视图,json,HttpResponse,序列化 From: https://www.cnblogs.com/Lucky-Hua/p/17599201.html