Django FBV andCBV
FBV_CBV
FBV 就是函数 :function
CBV 就是类 : Class
urls.py
url(r'cbv_index', views.CBV.as_view()) #这样就是去访问 views.py 里面的类
models.py
improt json # json格式转换,需要引用
from django.views improt View # 加载这个类
class CBV(View): # 使用时,必须继承 View 类 def get(self,request): #self.dispatch -> 看源码是如何操作的 pass def post(self,request): pass
写一个类继承VIEW 调用View 的dispath 函数之前做一个 session验证
要注意俩点:
1:用的 CBV 的话 需要导入 from django.utils.decorators import method_decorator 之后@method_decorator(auth)放在函数名上, 如果放在类上需要加个参数 @method_decorator(auth,name='get') ,说明是 给 get函数使用
2:但是django有个BUG 装饰器方法都会出现 CSRF问题 ,所以需要写一个dispath方法 直接调用VIEW里面的 dispath 进行反射@method_decorator(auth) 放在 dispath上面
serializers序列化
improt json
ditc1 = {'tag':None,'data':None, 'status': Ture } ret_data = json.dumps(ditc1) # 把字典转换为字符串 返回 return HttpResponse(ret_data)
还有一种格式QuerySet_list
的对象,它对象的点 就是QuerySet
对象
如果是QuerySet_List
就需要先把它转换成 QuerySet
再使用
user_obj.first()
#如果这样放入字典里再返回 就会报错!
from django.core import serializers
serializers
工具可以将queryset
转换成json
格式返回给前端
这样使用 :serializers.serialize('json', user_obj)
json_data = serializers.serialize('json', user_obj)
dict1['data'] = json_data
request.session['login']=user_obj.first().Name
return HttpResponse(json.dumps(dict1))
Django CBV 实现登录验证
urls.py
from hc import views
urlpatterns = [
url(r'del_session/', views.del_session),
url(r'login_demo/', views.Login.as_view()),
url(r'index/', views.Index.as_view()), # r'....' , views.[Class].as_view() 方法 ]
CBV 实现登录验证
views.py
from django.views import View
import json
#FBV
def del_session(request): request.session.clear() #清除session ,服务端的session删除了,客户端再用原来的cookie来验证,找不到它就失效了。 get_session = request.session.get('login',123) return HttpResponse(json.dumps(get_session)) #CBV class Auth(View): # 需要判断是否有session信息可以继承类来判断 def dispatch(self, request, *args, **kwargs): if request.session.get('login', False): # 判断 session的值是不是login response = super(Auth, self).dispatch(request, *args, **kwargs) # super() 函数是用于调用父类(超类)的一个方法 # print(response) return response else : # 没有这个session 就跳去login return redirect('/login_demo') class Index(Auth): #继承了这个Auth 类来判断用户的 session def get(self, request): # print (request.session) return HttpResponse('登录成功,欢迎使用本系统!') class Login(View): def get(self,request): # 请求为GET 时 会直接跳转到登录页面 return render(request, 'login.html') def post(self, request): # 请求为 POST 时,判断用户提交的表单 username = request.POST.get('username', False) # 当 username 取不到返回取值就为 False password = request.POST.get('password', False) # 当 password 取不到返回取值就为 False if not username or not password: return HttpResponse('输入不能为空!') else: # 查询数据库 并判断是否成功 user_obj = models.UserInfo.objects.filter( username=username, password=password ) #这里取不到数据库的内容就是 为False ,上面定义的 if user_obj.first(): #登录成功 # print(user_obj.first().name) request.session['login'] = user_obj.first().name #写入session信息。这里的 login要和 del session 的一致 # 这里的session 相当于一个字典,把对应的key传入对应的值 # print (request.session['login']) # print ('----------------------') # print (request.session.get('login')) return redirect('/index') else : return HttpResponse('用户名或密码错误!')
总结
CBV
本质,基于反射来实现的
流程,路由,as_view() -> 内部源码view里面的dispatch方法 -> 反射执行
取消csrf_token认证。
针对于类里面的dispatch方法上面加入装饰器
@csrf_protect # 需要验证csrf_token认证
@csrf_exempt # 免除csrf_token认证
针对于类上面使用加入装饰器
@method_decorator(csrf_exempt, name='dispatch') # 加在类上面
class Xxxx(view):
CBV 的知识点
如果在CBV里面加装饰器需要导入一个包
from django.urils.decorators import method_decorator # 在CBV里加装饰器需要导入的包
- @method_decorator(csrf_exempt) #在dispatch 方法中使用
- @method_decorator(csrf_exempt, name='dispatch') # 加在类上面
@method_decorator(csrf_exempt) # 加载类方法上面
def dispatch(self, request, *args, **kwargs):
return super(Mydispatch, self).disptch(request, *args, **kwargs)
@method_decorator(csrf_exempt, name='dispatch') # 加在类上面
class Xxxx(view):
扩展知识:
-csrf
基于中间件的process_view方法
装饰器给单独函数进行设置(认证或者无需认证)