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)