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)

  

  

原文地址:https://www.cnblogs.com/yan-peng/p/10222970.html