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')