zoukankan      html  css  js  c++  java
  • 七、Django之Views

    一、概述

    视图就是python中的函数,我们通常也称为:视图函数。

    视图一般被定义在“app/views.py”中。

    视图负责接受Web请求(HttpRequest)URL,进行逻辑处理,并返回Web响应(HttpResponse)给请求者。

    视图函数的第一个参数必须为HttpRequest实例,还可能包含如下参数:

    • 通过正则表达式组获得的关键字参数
    • 通过正则表达式组获取的位置参数
    • 视图必须返回一个HttpResponse对象或子对象作为响应

     

    二、视图操作

    1、URLconf

    定义url和视图函数的对应关系,app/urls.py中定义urlpatterns列表,存储url()对象

    from django.conf.urls import include, url
    
    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^blog/', include('blog.urls')),
    ]
    

      

    2、URL中的参数

    位置参数

    url(r'^(d+)/$',views.hello)

     

    关键字参数

    url(r'^(?P<year>d+)/$',views.year)

     

     

    三、视图中核心对象

    http请求中有两个核心对象: 
      请求:HttpRequest对象 
        响应:HttpResponse对象 

    1.HttpRequest对象 


    当请求一个页面时,Django 创建一个 HttpRequest对象包含原数据的请求。然后 Django 加载适当的视图,通过 HttpRequest作为视图函数的第一个参数。每个视图负责返回一个HttpResponse目标。

    path:       请求页面的全路径,不包括域名
    method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
                       if  req.method=="GET":
                                 do_something()
                       elseif req.method=="POST":
                                 do_something_else()
    GET:         包含所有HTTP GET参数的类字典对象
    POST:       包含所有HTTP POST参数的类字典对象
                 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
                 HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
                 if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"
    COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
    FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 
                name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
                filename:      上传文件名,用字符串表示
                content_type:   上传文件的Content Type
                content:       上传文件的原始内容
    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支持时该属性才可用。
    META:       一个标准的Python字典包含所有可用的HTTP头。可用标题取决于客户端和服务器,但这里是一些例子:
                CONTENT_LENGTH       – 请求体的长度(一个字符串)。
                CONTENT_TYPE         – 请求体的类型。
                HTTP_ACCEPT          - 为响应–可以接受的内容类型。
                HTTP_ACCEPT_ENCODING – 接受编码的响应
                HTTP_ACCEPT_LANGUAGE – 接受语言的反应
                HTTP_HOST            – 客户端发送的HTTP主机头。
                HTTP_REFERER         – 参考页面
                HTTP_USER_AGENT      – 客户端的用户代理字符串。
                QUERY_STRING         – 查询字符串,作为一个单一的(分析的)字符串。
                REMOTE_ADDR          – 客户端的IP地址
                REMOTE_HOST          – 客户端的主机名
                REMOTE_USER          – 用户通过Web服务器的身份验证。
                REQUEST_METHOD       – 字符串,如"GET"或"POST"
                SERVER_NAME          – 服务器的主机名
                SERVER_PORT          – 服务器的端口(一个字符串)。
    

      

    2.HttpResponse对象 

    对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。 
    在HttpResponse对象上扩展的常用方法: 

    • - 页面渲染:render(推荐),render_to_response(将被遗弃)
    • - 页面跳转:redirect (跳转)
    • - locals: 可以直接将对应视图函数中所有的变量传给模板 

    3. render() 

    语法:

    render(requesttemplate_namecontext=Nonecontent_type=Nonestatus=Noneusing=None)

    参数说明:

    request:必选参数。产生回应的请求对象。
    template_name:必选参数。一个模板名称或模板序列的全称,如果是序列给定的,则将会使用第一个存在的。
    context:可选参数,添加到模板中的键对值,默认为{}
    content_type:可选参数。返回文档的MIME类型,默认值EFAULT_CONTENT_TYPE 中设置。
    status:可选参数,response的返回码,默认为200
    using:可选参数,用来加载模板的一个模板引擎名称
    

     

    范例:

    from django.shortcuts import render
    
    def my_view(request):
        return render(request, 'myapp/index.html', {'foo': 'bar',},content_type='application/xhtml+xml')
    

      

    4、render_to_response()【将被遗弃】

    语法:

    render_to_response(template_namecontext=Nonecontent_type=Nonestatus=Noneusing=None)

    This function preceded the introduction of render() and works similarly except that it doesn’t make the request available in the response. It’s not recommended and is likely to be deprecated in the future.
    这个函数是render()的前身,和render唯一区别是没有request参数。不推荐使用的,因为它将可能会被遗弃。
    

      

    5、redirect()

    语法:

    redirect(topermanent=False*args**kwargs)

    Returns an HttpResponseRedirect to the appropriate URL for the arguments passed.
    对于传入的合适的URL参数返回一个HttpResponseRedirct
    The arguments could be: 参数可能是:

    参数是一个model:model的get_absolute_url()函数将会被调用。 A model: the model’s get_absolute_url() function will be called.

    参数是一个函数视图名,可能带有参数:reverse()将会被用来反向解析名称。 A view name, possibly with arguments: reverse() will be used to reverse-resolve the name.

    一个绝对或者相对URL,这个地址将会被用于重定向。 An absolute or relative URL, which will be used as-is for the redirect location.

    默认情况下是一个临时性重定向,通过传递参数 permanent=True来声明一个永久重定向。 By default issues a temporary redirect; pass permanent=True to issue a permanent redirect.

      

    Examples

    a、参数是一个model

    from django.shortcuts import redirect
    
    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object)
    

      

    b、参数是一个视图函数名,可带关键字参数

    def my_view(request):
        ...
        return redirect('some-view-name', foo='bar')
    

      

    c、通过URL重定向

    def my_view(request):
        ...
        return redirect('/some/url/')
        return redirect('https://example.com/')
    

      

     

    6、get_object_or_404()

    Calls get() on a given model manager, but it raises Http404 instead of the model’s DoesNotExist exception.

    调用给与的model manager的get方法,如果对象不存在,则会引发Http404异常。

    语法:

    get_object_or_404(klass*args**kwargs)

    kclass

    一个获取实例的Model类或者一个QuerySet()。

    **kwargs

    Lookup parameters, which should be in the format accepted by get() and filter().

    可以被get()或者filter()函数结束的查询参数。

    例如:

    from django.shortcuts import get_object_or_404
    
    def my_view(request):
      #获取MyModel中pk=1的对象,如果没有的话,则会引发异常:MyModel.DoesNotExist
      my_object = get_object_or_404(MyModel, pk=1)
    

      

    7、get_list_or_404()

    Returns the result of filter() on a given model manager cast to a list, raising Http404 if the resulting list is empty.

    对于给出的model manager执行filter()之后,赋值给一个列表,如果结果为空,则引发Http404异常。

     

  • 相关阅读:
    单例模式——C++实现
    单例模式——java实现
    组合模式——java实现
    桥接模式——Java实现
    桥接模式——C++实现
    适配器模式——java实现
    编写一个显示当前时间的jsp页面
    适配器模式——C++实现
    安装配置hadoop1
    Nginx使用教程
  • 原文地址:https://www.cnblogs.com/skyflask/p/9320887.html
Copyright © 2011-2022 走看看