视图函数介绍

http请求中的两个核心对象

  • http请求:HttpRequest对象
  • http响应:HttpResponse对象

位置:django,http

在视图函数中,request对象就是HttpRequest,可以用 isinstance(request, HttpRequest) 判断,结果为True

HttpRequest对象的属性和方法

属性

属性 说明
path 请求页面的全路径,不包括域名
method 请求中使用的HTTP方法的字符串表示。全大写表示,例如:POST GET
GET 包含所有HTTP GET参数的类字典对象
POST 包含所有HTTP POST参数的类字典对象
COOKIES 包含所有cookies的标准Python字典对象;keys和values都是字符串。
FILES 包含所有上传文件的类字典对象
user

是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。可以通过user的is_authenticated()方法来辨别用户是否登陆:
if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用

session 唯一可读写的属性,代表当前会话的字典对象;只有激活Django中的session支持时该属性才可用。

 

 

 

 

关于request.FILES

FILES中的每一个KEY都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

  • filename:      上传文件名,用字符串表示
  • content_type:   上传文件的Content Type
  • content:       上传文件的原始内容

方法

request.get_full_path():比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123,而request.path得到的是/index33

在request.POST中一个常用的方法:request.POST.getlist('name')

HttpResponse对象

页面渲染

render_to_response() 

  • 参数一:字符串类型,html文件的路径
  • 参数二:字典类型,渲染到html页面的上下文对象

使用方式:

return render_to_response("index.html", {"name": name, "user": user})

render()

  • 参数一:HttpRequest对象
  • 参数二:字符串类型,html文件路径
  • 参数三:字典类型,渲染到html页面的上下文对象

使用方式:

return render(request, "index.html", {"user": user, "pwd": pwd})

render()方法和render_to_response()方法的区别就是,传入的参数不一样 ,render_to_response()不用传入HttpRequest对象

页面跳转

redirect()

  • 参数一:字符串对象,要跳转的URL路径

在登录的时候可以使用:

如果用户输入了正确的用户名跟密码,这个时候在视图函数中可以直接用render()返回一个登录页面,也可以用redirect()跳转到登录链接,那么这两种方法的区别是什么呢?

在使用render()返回一个登录页面的时候,浏览器的URL不会改变,还是登录的URL,这时用户只需要对准URL栏一个回车就又会回到登录页面,这显然不是希望看到的,所以在做类似的业务时用redirect()更加合适

locals()

可以直接将函数中所有的变量传给模板,包括request以及它的属性都能拿到,但是也是locals()被诟病的地方

使用方法:

return render(request, "index.html", locals())  # 不用再用字典一个一个的传了,在变量比较多的时候比较实用

CBV跟FBV

上面通过函数去处理结果的方式叫做FBV,其实,除了通过函数处理还可以通过类来处理,这种处理方式叫做CBV

首先在url中些路由映射时映射到指定的类

url("^index$", views.CBV.as_view())

然后书写相应的类

在书写类的时候应该继承View类,这样之后,通过该url过来的get请求会走get()方法,post请求会走post()方法

class CBV(View):
    def get(self, request):
        return HttpResponse("get")

    def post(self, request):
        return HttpResponse("post")

dispatch()方法

其实不管是post请求还是get请求或者其他的请求,在到达相应的方法之前会先走dispatch()方法,因此如果在post跟get请求处理前有还需要做什么处理可以在dispatch()方法中完成,就像装饰器一样

CBV中的请求方法:  get post put patch delete head options trace

posted @ 2018-07-03 16:49  Jin同学  阅读(528)  评论(0)    收藏  举报