博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django之视图(views.py)
阅读量:6542 次
发布时间:2019-06-24

本文共 6568 字,大约阅读时间需要 21 分钟。

一:视图的作用

二:视图的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 adminfrom django.urls import path,includeurlpatterns = [    path('admin/', admin.site.urls),    path("",include("front.urls",namespace="front"))]

APP中的url:

from django.urls import pathfrom front import viewsapp_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("

我爱python

",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,TemplateViewclass 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

    {
    % for book in books %}
  • {
    { book.name }}
  • {
    % endfor %}

   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_decoratordef login_required(func):    def wrapper(request,*args,**kwargs):        if request.GET.get("username"):            return func(request,*args,**kwargs)        else:            return HttpResponse("类装饰器")    return wrapperclass 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)

 

  

  

转载于:https://www.cnblogs.com/yan-peng/p/10222970.html

你可能感兴趣的文章
linux 系统下,忘记密码的快捷解决方法。
查看>>
安排考场,贪心
查看>>
动态数组第k小,Poj(1442)
查看>>
Uva 1103 古代象形文字
查看>>
Gym 100090M Jumping along the Hummocks
查看>>
Oracle PL/SQL学习之你需要知道的快捷键
查看>>
FSCapture
查看>>
01、控制相机跟随玩家
查看>>
golang语言中os/exec包的学习与使用
查看>>
Centos 编译安装高版本Python方法
查看>>
poj3009
查看>>
pytorch常用normalization函数
查看>>
在Ubuntu Desktop 12.04 LTS中安装Subversion
查看>>
Docker for Web Developers目录
查看>>
原生js获取window高和宽
查看>>
每天一个linux命令(19):find命令概述
查看>>
背包九讲(转载)
查看>>
java中的权限修饰符的理解
查看>>
ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
查看>>
《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
查看>>