zoukankan      html  css  js  c++  java
  • Django之视图(views.py)

    一:视图的作用

    二:视图的url配置

    三:WSGIRequest对象

    四:HttpResponse和JsonResponse

    五:视图装饰器

    六:重定向

      (1)301重定向

      (2)302重定向

    七:类视图

      (1)View()类

      (2)TemplateView()类

      (3)ListView()类

      (4)类视图装饰器

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1,视图的作用相当于URL和模板的连接器,我们在浏览器中输入URL,Django通过视图找到相应的模板,然后返回给浏览器。

    2,视图的URL配置过程:在setting中的:ROOT_URLCONF,找到项目中的url.py的配置,然后是APP中的url.py的配置,然后通过一定的匹配规则找到相应的视图函数

    setting:

    ROOT_URLCONF = 'lianxi03.urls'

    项目url:

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("",include("front.urls",namespace="front"))
    ]

    APP中的url:

    from django.urls import path
    from front import views
    app_name= "front"
    urlpatterns=[
        path("",views.index,name="index"),
    ]

    3,HTTP请求中的两个核心对象:
      HttpRequest:请求对象

      HttpResponse:返回对象

    4,WSGIRequest(即视图函数的第一个参数request)对象和HttpResponse对象:

      一个视图函数的第一个参数必须是request,并且必须有一个HttpResponseBase对象或者他的子类对象的返回值

      Django在接收到http的请求后,会根据http携带的参数和报文信息生成一个WSGIRequest对象,并且作为视图函数的第一个参数传递给视图函数(request),

    这个对象上包含着客户端上传的各种信息,视图函数处理完相关的逻辑后,也需要返回一个HttpResponseBase对象或者他的子类对象给浏览器。用的最多的子类对象就是HttpResponse.

      (1)WSGIResquest对象常用的属性和方法:

      (2)HttpResponse对象常用的属性和方法:

          content:返回的内容

          status_code:返回的http状态码

          write():写入数据到content中

          set_cookie:设置cookie

          delete-cookie:删除cookie

          content_type:返回数据的MIME类型,默认text/html,浏览器器会根据这个来显示数据常用的有:

            text/html:(默认的,HTML文件)

            text/plain:(纯文本)

            text/css:(css文件)

            text/javascript:(js文件)

            multipart/form-data:(文件提交)

            application/json:(json传输)

            application/xml:(xml文件)

    def index(request):
        response = HttpResponse("<h1>我爱python</h1>",content_type="text/plain;charset=utf-8")
        response.status_code = 400
        response["X-Token"] = "python"
        response.content = "悠悠"
        response.write("123")
        return response

      (3)JsonResponse类:

        JsonResponse类继承自HttpResponse类;用来把对象dump成json字符串,然后将字符串封装成Response对象返回给浏览器。他的content_type为application/json

    persons =[
            {"name":"xiaoming",
             "age":18,
             "sex":0
             },
            {"name": "xiaoming",
             "age": 18,
             "sex": 0
             },
        ]
        return JsonResponse(persons,safe=False)
        # return JsonResponse({"username":"xiaoming","age":15})
        # 默认情况下只能对字典进行dump,如果是非字典需要传递一个参数safe=False

     5视图装饰器:

      Django内置了一些装饰器用来装饰视图函数,给视图函数一些限制,比如这个视图函数只能通过GET访问或者其他方式访问之类的

      常用的有:

      require_http_methods():可以传递一个列表

      require_GET:只能通过get的方法访问

      require_POST:只能通过POST方式访问

      require_safe:只能通过安全的方式访问.(get,head)两种方式

    from django.views.decorators.http import require_http_methods,require_POST,require_GET,require_safe
    
    # @require_http_methods(["GET","POST"])
    # @require_GET = @require_http_methods(["GET"])
    # @require_POST = @require_http_methods(["POST"])
    # @require_safe = = @require_http_methods(["GET","HEAD"])
    @require_safe def index(request): if request.method == "GET": return HttpResponse("get") else: return HttpResponse("post")

     6重定向:

      重定向就是当你输入一个网页的时候会自动跳转到另一个网页上去,分暂时重定向(301)和永久性重定向(302)

      redirect(to,*args,permanent=False,**kwargs);   参数permanent表示这个重定向是否为永久重定向,默认为False

    def index(request):                #访问首页的时候直接跳转到电影页面
        return redirect(reverse("front:move"))

     7类视图:

      以函数的形式定义的视图就是函数视图,这个比较容易理解,当我们一个函数视图要处理不同的Http请求的时候(post,get等)就需要在函数中写不同的逻辑代码这样写起来就比较麻烦也比较,代码复用率很低。所以就引入的类视图。

      常用的类视图有:VIew,TemplateView,ListView

      View类:所有类视图的基类,都继承自它。我们自己定义的类视图一般也继承自这个类。

    view.py(请求这个类视图函数的时候,如果是get方法就走get函数,post方法就走post函数,如果方法不在允许范围内就走最后一个方法)

    from django.views.generic import View,ListView,TemplateView
    class BaseIndex(View):
        def get(self,request,*args,**kwargs):
            return render(request,"index.html")
    
        def post(self,request,*args,**kwargs):
            return render(request,"login.html")
    
        def http_method_not_allowed(self, request, *args, **kwargs):
            return HttpResponse("方法不允许")

    url.py(url中,需要加上as_view()方法)

    urlpatterns=[
        path("",views.BaseIndex.as_view(),name="index"),
    ]

      TemplateView类:用来返回一个模板

      常用的两个属性:template_name 和 get_context_data

    class AboutView(TemplateView):
        template_name = "about.html"      #返回这个指定的页面
        def get_context_data(self, **kwargs):
            context =super().get_context_data(**kwargs)  #调用父类的context方法
            context["username"]="books"    #给这个页面传递参数
            return context

      url.py

    urlpatterns=[
        path("about/",views.AboutView.as_view(),name="about"),
    ]

      ListView类:当我们需要将数据库中的一些表展示出来的时候,就会用到这个类,比如文章列表,图书列表等

    model.py

    class Books(models.Model):
        name = models.CharField(max_length=12)
        content = models.TextField()
        create_time = models.DateTimeField(auto_now_add=True)

    view.py

    class BooksView(ListView):                  #继承自ListView
        model = Books                    #指定这个列表的数据来自哪个模型
        template_name = "books.html"     #指定这个列表的模板
        paginate_by = 10                  #指定这个列表一页可以显示多少条数据
        context_object_name = "books"    #执行这个列表在模板中的参数名称
        ordering = "create_time"         #指定这个列表的排序方式
        page_kwarg = "p"               #获取第几页时的参数名称(默认是page)
    
        def get_context_data(self, *, object_list=None, **kwargs):                #获取上下文数据,可以传递模型中没有的变量
           context = super(BooksView,self).get_context_data(**kwargs)
           return context
           def get_queryset(self):                    #可以对列表进行删选(默认是全部列表)
            # return Books.objects.all()
            return Books.objects.filter(id__lte=8)

    html.py

    <ul>
        {% for book in books %}
           <li>{{ book.name }}</li>
        {% endfor %}
    </ul>

       8给类视图添加装饰器(给类添加装饰器有两种方式:

      第一种:直接装饰到类上

    from django.utils.decorators import method_decorator   #导入装饰器
    
    def login_required(func):           #定义一个装饰器
        def wrapper(request,*args,**kwargs):
            if request.GET.get("username"):
                return func(request,*args,**kwargs)
            else:
                return HttpResponse("类装饰器")
        return wrapper
    @method_decorator(login_required,name
    ="dispatch") #添加装饰器 class BaseIndex(View): def get(self,request,*args,**kwargs): return render(request,"index.html")

      第二种方式:装饰到dispatch方法上

    from django.utils.decorators import method_decorator
    
    def login_required(func):
        def wrapper(request,*args,**kwargs):
            if request.GET.get("username"):
                return func(request,*args,**kwargs)
            else:
                return HttpResponse("类装饰器")
        return wrapper
    
    class BaseIndex(View):
        def get(self,request,*args,**kwargs):
            return render(request,"index.html")
    
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super().dispatch(*args, **kwargs)

      

      

  • 相关阅读:
    iconv 文件编码相互转换
    MySQL 字符编码
    MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法
    PHP 输出日志到文件 DEMO
    Nginx http -> https 跳转后 POST 丢失
    SSH SCP 远程密钥登录配置和服务器间的文件传输
    Mac 安装 7zip
    git pull There is no tracking information for the current branch.
    MacOS 安装配置 Laravel
    Mac OS 安装 MySQL5.7
  • 原文地址:https://www.cnblogs.com/yan-peng/p/10222970.html
Copyright © 2011-2022 走看看