Django基础之视图函数

Django基础之视图函数

一.Django的视图函数view

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
  响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
  无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

二.CBV和FBV

FBV(function base views) 就是在视图里使用函数处理请求。

CBV(class base views) 就是在视图里使用类处理请求。

CBV优点主要下面两种:

  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)

  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

1)**views视图FBV简单版
from django.shortcuts import render,HttpResponse
def login(request):         #用户输入ip端口直接进入登录页面

       return render(request,'login.html')

def daa(request):          #输入完账号密码跳转另一个界面验证登录结果

       print(request.POST)
       username=request.POST.get('username')
       password=request.POST.get('password')
       if username=='dabai' and password=='123':
           return render(request,'daa.html')
       else:
           return HttpResponse('404! 账号或密码输入错误')
       
       
       
 **views视图CBV版
from django.shortcuts import render,HttpResponse
from django.views import View
class login(View):                   #在URL处引用Views方法获得 取值方法

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

   def post(self,request):
       username=request.POST.get('username')
       password=request.POST.get('password')
       if username=='dabai' and password=='123':
           return render(request,'daa.html')
       else:
           return HttpResponse('404! 账号或密码输入错误')

       
       
       
 URL:
   登录验证FBC版本
   url(r'^$',views.login),
   url(r'^daa/',views.daa)

   登录验证CBV版本
   url(r'^login/',views.login.as_view()),   #简单版本,相当于得到了的获取值得方法,然后调用login类中的具体方法
2)添加装饰器
*** 登录加上装饰器FBV版
url(r'^login/',views.login)
***views视图FBV加装饰器版
def wapper(f1):          #装饰器部分
   def inner(*args,**kwargs):
       print('我在前面么')
       ret=f1(*args,**kwargs)
       print('我再谁后面')
       return ret
   return inner

@wapper
def login(request):

   if request.method=='GET':
       return render(request,'login.html')

   else:
       username=request.POST.get('username')
       password=request.POST.get('password')
       if username=='dabai' and password=='123':
           return render(request,'daa.html')
       else:
           return HttpResponse('404! 账号或密码输入错误')
       
       

       
       


***登录加上装饰器CBV版
url(r'^login/',views.login.as_view())      
             
*** views视图CBV加装饰器版  3种方式

def wapper(f1):               #装饰器部分
   def inner(*args,**kwargs):
       print('我在前面么')
       ret=f1(*args,**kwargs)
       print('我再谁后面')
       return ret
   return inner

from django.utils.decorators import method_decorator

@method_decorator(wapper,name='post')
@method_decorator(wapper,name='get')
       方法一:直接在login类上面添加装饰器,调用django内的method_decorator方法
           该方法想给哪个类方法加装饰,就必须在括号内写出名字
           如果有多个,则分开写多行

class login(View):                   #在URL处引用Views方法获得 取值方法

   # @wapper
       #方法二:增加dispatch方法,然后在该方法上添加装饰器,相当于给其下所有的类方法加上了装饰器

   def dispatch(self, request, *args, **kwargs):
       ret=super(login, self).dispatch(request, *args, **kwargs)
       return ret

三.request(响应)对象

1.相关解释

当一个页面被请求时,Django就会创建一个包含本次请求原信息(请求报文中的请求行、首部信息、内容主体等)的HttpRequest对象。
  Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。

 

  当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。
  Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。

2.请求相关的常用值
  • path_info     返回用户访问url,不包括域名

  • method        请求中使用的HTTP方法的字符串表示,全大写表示。

  • GET              包含所有HTTP  GET参数的类字典对象

  • POST           包含所有HTTP POST参数的类字典对象

  • body            请求体,byte类型 request.POST的数据就是从body里面提取到的

print(request.method)       #GET          获得的是请求方法
print(request.path_info)    #/index/       获得的是请求路径
print(request.GET)          #           获得的是GET请求方法得到的内容
print(request.POST)         #           获得的是POST请求方法得到的内容
print(request.body)         #请求体,byte类型,POST获取的数据就是从这里提取的
print(request.get_full_path())  #获取的是除域名之外的所有路径
print(request.META.get('HTTP_USER_HEADER'))   #获取的是META请求头 源信息
print(request.META.get('REMOTE_ADDR'))     #获取客户端ip地址
posted @ 2019-05-20 22:39  socoolonly1  阅读(64)  评论(0编辑  收藏  举报