标签:javascrip 路由 head utils 执行时间 需要 decorator post方法 你好
在视图层,三个重要的方法:HttpResponse、render、redirect
在视图函数必须要有一个返回值,并且返回值的数据类型必须是HttpResponse对象
原理:利用两个模块
from django.template import Template,Context
def login(request):
res = Template('<h1>{{ user }}</h1>')
con = Context({'user':{'username':'cwz','password':'123'}})
return HttpResponse(res.render(con))
通常情况下,前后端数据交互采用的都是json的字符串。后端只需要写好对应的url接口,前端访问这个接口。
用来告诉前端工程师,这个接口能够返回哪些数据
python后端 | JavaScript前端 |
---|---|
json.dumps | JSON.stringify |
json.loads | JSON.parse |
将一个字典序列化成字符串:
import json
def index(request):
user_dic = {'name': 'cwz你好啊', 'password': '123'}
# ensure_ascii 参数控制对中文是否转码, 默认是True
json_str = json.dumps(user_dic, ensure_ascii=False)
return HttpResponse(json_str)
在django中有JsonResponse
from django.http import JsonResponse
def index(request):
user_dic = {'name': 'cwz你好啊', 'password': '123'}
return JsonResponse(user_dic, json_dumps_params={'ensure_ascii': False})
JsonResponse默认序列化字典,如果想序列化其他数据类型,可以加safe参数
from django.http import JsonResponse
def index(request):
lt = [1,2,3,4,5,]
return JsonResponse(lt, safe=False)
FBV :基于函数的视图
CBV:基于类的视图
在urls.py
中写路由地址
url(r'login/', views.MyLogin.as_view())
在视图层views.py
中写
from django.views import View
class MyLogin(View):
def get(self, request):
print('我是MyLogin里面的get方法')
return render(request, 'login.html')
def post(self, request):
print('我是MyLogin的post方法')
return HttpResponse('post')
运行上面的代码,可知CBV能够根据请求方式的不同,自动的执行不同的方法。
首先看路由,urls.py
中:
url(r'login/', views.MyLogin.as_view())
经过分析可知:
as_view()
方法就是一个函数,函数名加括号执行优先级最高进入as_view
源码:
这样路由匹配关系就相当于这样:url(r‘login/‘, views.view)
这就说明了CBV在路由匹配上,其实本质上还是FBV。
然后去 dispatch
方法中看
总结CBV能够根据请求方式的不同,自动的执行不同的方法:
as_view
源码,是一个类的绑定方法,返回一个view函数名self.dispatch
, dispatch对象、类中都没有,在父类中有,在dispatch中分析hander=get方法
,然后调用get方法,执行get函数。# 计时任务的装饰器
import time
from functools import wraps
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time() - start
print(f'函数执行时间:{end}')
return res
return inner
# 法1,直接写
class MyLogin(View):
@outter
def get(self, request):
print('我是MyLogin里面的get方法')
return render(request, 'login.html')
@outter
def post(self, request):
print('我是MyLogin的post方法')
return HttpResponse('post')
推荐使用django提供的模块写 from django.utils.decorators import method_decorator
# 法2
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(outter, name='get') # 可以指定给谁装
class MyLogin(View):
def get(self, request):
print('我是MyLogin里面的get方法')
return render(request, 'login.html')
# 法3
class MyLogin(View):
@method_decorator(outter)
def get(self, request):
print('我是MyLogin里面的get方法')
return render(request, 'login.html')
# 法4
@method_decorator(outter, name='dispatch')
class MyLogin(View):
#@method_decorator(outter) # 也可以在dispatch方法上加装
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
print('我是MyLogin里面的get方法')
return render(request, 'login.html')
def post(self, request):
print('我是MyLogin的post方法')
return HttpResponse('post')
标签:javascrip 路由 head utils 执行时间 需要 decorator post方法 你好
原文地址:https://www.cnblogs.com/setcreed/p/11938792.html