views视图

views视图

GET请求相关的属性方法

GET请求 提交的参数叫查询参数 默认用户请求跟数据相关的内容

request.META 返回请求头信息 Query_Sting 请求的数据  
'Query_Sting':'username = dazhung & password = 123'
user_agent 封装的是 用户代理信息

request.GET :返回一个 Query_Dict 取数据 request.GET.get('username')
request.path/request.path_info :得到的是路径 /index/
request.get_full_path() :/index/?username=taibai&password=222

request.body post请求下最原始的数据字节 b'username=dazhuang'

响应相关的属性和方法

Httpresponse --> 返回字符串
render ---> 返回html页面
redirect ---> 重定向
jasonresponse --->以后讲

重定向

应用场景: 1.登录后页面的跳转  2.旧服务器停止使用,访问旧网址,重定向新网址
原理 : 发送302状态码 响应头里有location 相当于 location.href
示例:
def index(request):
  if request.method == 'GET':
      return render(request,'index.html')
  else:
      username = request.POST.get('username')
      pwd = request.POST.get('password')
      if username =='taibai' and pwd =='123':
          return redirect('/home/')
      else:
          return HttpResponse('滚一边去')
状态码: 301 302
<meta name ='keyword'content = '路飞 路飞学成 ....'>
301 永久重定向 网站关闭,旧网址永久重定向新网址
302 临时重定向 网站资源还在,临时定向新网站

FBV 基于函数

fbv- function based view

FBV视图 请求分发搞事情 加装饰器

加装饰器:
def wapper(f):
  def inner(*args,**kwargs):
      print('请求分发之前')
      ret = f(*args,**kwargs)
      print('请求分发之后')
      return ret
  return inner

@wapper
def main(request):
  return HttpResponse('欢迎来到项目首页!')

 

CBV 基于类

cbv -- class based view
url:
url(r'login2/',views.loginView.as_view()),
views:
#CBV视图
# 导入View类
from django.views import View
#继承View
class loginView(View):
  def get(self,request):
      return render(request,'login2.html')

  def post(self,request):
      user = request.POST.get('user')
      pwd = request.POST.get('pwd')
      print(user,pwd)
      return HttpResponse('登录成功!')

CBV原理 通过不同的请求方法找对应视图类里的方法

1.views.loginView.as_view() ---> 调用父类View的as_view()方法 返回view
2.django 内部会自动执行view方法, 即父类View的view方法
3.       def view(request, *args, **kwargs):
          self = cls(**initkwargs) 产生调用类的实例化对象
          self.request = request 封装request,参数
          self.args = args
          self.kwargs = kwargs
          return self.dispatch(request, *args, **kwargs) //调用dispatch()方法
4.http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']          
5.       if request.method.lower() in self.http_method_names:
          handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
      else:
          handler = self.http_method_not_allowed

关键就是这个反射 getattr(), 如果请求方式在http_method_names里边,会调用 loginView类 里的方法,如果没有 会给你警告日志

CBV 请求分发的时候搞点事情

一 类中所有请求都搞事

方式一 dispatch 拓展

路由
url('login2/',views.loginView.as_view())
视图逻辑处理
class loginView(View):
  def dispatch(self, request, *args, **kwargs):
      #分发请求前搞事情
      print('请求要来了')
      #分发请求
      ret = super().dispatch(request,*args,**kwargs)
      #分发请求后搞事情
      print('请求处理完,马上响应')
      #返回响应
      return ret

  def get(self,request):
      return render(request,'login2.html')

  def post(self,request):
      user = request.POST.get('user')
      pwd = request.POST.get('pwd')
      print(user,pwd)
      return HttpResponse('登录成功!')

方式二 加装饰器

1,from django.utils.decorators import method_decorator
2.在dispatch方法前加
@method_decorator(wapper)

二 类中某个请求前搞事情

方式一

 在方法前加装饰器
@method_decorator(wapper)
  def get(self,request):
      print('get方法执行了')
      return render(request,'login2.html')

方法二

在类前面加 name后面对应加装饰器的方法
@method_decorator(wapper,name='get')

 

上一篇:Django怎么获取get请求里面的参数


下一篇:django-路由层