视图层:
发送数据:
三种后端往前端页面发送数据的方式:
httpResponse --> 字符串
render --> html数据
redirect --> 重定向(网址)
网址 : ip+ port + 参数(正则匹配)
#视图函数必须有一个返回值 并且返回值的数据类型必须是HttpResponse对象
JsonResponse :
---前后端数据交互的方式!
通常情况下前后端数据交互采用的都是json的字符串(字典)
#后端的工作内容:
后端只需要写好相应的url接口 前端访问你这个接口;
只需要返回一个大字典 + 开发文档(用来告诉前端工程师 你这个接口能够返回哪些数据)
python后端与前端序列化的方法:
python后端 js前端
json.dumps JSON.stringify 序列化
json.loads JSON.parse 反序列化
JsonResponse:
django内序列化:
def index(request):
user_dic = {'name':'sao逼','password':'123'}
#存在中文会乱码!!!
#1.第一种:
json_str = json.dumps(user_dic,ensure_ascii=False)
#ensure_ascii默认为True,改为False能识别中文
return HttpResponse(json_str)
#第二种:
return JsonResponse(user_dic,json_dumps_params={'ensure_ascii':False})
## JsonResponse默认是序列化字典用的 如果你想序列化其他数据类型(json模块能够序列化的) 你需要加一个safe参数
#第三种(序列化列表,元组):
l = [1,2,3,4,5,6,7,]
return JsonResponse(l,safe=False)
FBV与CBV
FBV与CBV:
FBV:基于函数的视图
CBV:基于类的视图
from django.views import View
from django.shortcuts import render,HttpResponse,redirect
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有点不同
# FBV写法 路由(index) >>> 视图函数内存地址
url(r'^index/',views.index),
# CBV写法
url(r'^login/',views.MyLogin.as_view())
iew
#项目一启动 会自动执行as_view方法
# 1. 函数名 + () : 执行的优先级最高
2. View类:as_view(cls, **initkwargs)
3.MyLogin: 手动创建的类
4.as_view()内闭包-view() --> view
5.CBV在路由匹配上 其实本质还是FBV
CBV: 在urls内创建的类,必须调用as_view(),
调用后触发dispath()的执行,确认请求方式 + () ,
在返回类中自动调用该方法!!!
CBV加装饰器
给CBV加装饰器 使用内置模块:
from django.utils.decorators import method_decorator
方法一:
# @method_decorator(outter,name='post')
-->指定类内的post函数,添加装饰器
class MyLogin(View):
def post(self,request):
return
方法二:
# @outter /
# @method_decorator(outter)
--->放置在函数前,作为函数的装饰器
def get(self,request):
print('我是MyLogin里面的get方法')
return render(request,'login.html')
装饰器实列
装饰器:
import time
from functools import wraps
def outtrt(func):
@wraps(func)
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time() - start_time
print('end_time')
return inner