Django中的视图层,负责处理用户的请求并返回响应。
Django的视图是可调用的对象,因此有两种方式的视图:通过Python函数实现的函数视图和通过Python类实现的类视图。通过视图,用户接受web请求,同时返回web响应。响应可以是文本、HTML页面、图像…….
视图的定义可以在项目的任意一个模块中,但是Django每个应用的views.py就是专门用来定义视图。
由于在之后的开发中,用的最多的实际上是DjangoREST中提供的视图,因此,对于初学者来说,此处仅仅了解下即可。
函数视图是一个Python函数,接受一个HttpRequest类型的对象作为参数,返回包含生成的响应的HttpResponse对象,其格式如下:
from django.http import HttpRequest,HttpResponse
def func(request):
......
return HttpResponse()
如何通过函数创建一个视图并当用户输入url时展示在页面呢?由以下两步就可以搞定
在任意应用的views.py中:
from django.http import HttpRequest,HttpResponse
def helloword(request):
return HttpResponse("Hello,Django!")
HttpRequest对象在请求时自动创建,HttpResponse则需要我们创建。
在项目的配置文件(settings.py)中,ROOT_URLCONF
字符串指定了整个项目的根url配置文件,如:
ROOT_URLCONF = 'mysite.urls'
因此,我们也在mysite的urls.py中配置url,在该文件中:
"""mysite URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include
from polls import views
urlpatterns = [
path('admin/', admin.site.urls),
]
在这个文件注释中对三种方式创建url进行了说明。首先导入对应的views模块,然后在urlpatterns
列表中通过path()来指定一个url,如:
from polls import views
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.helloword, name='helloword'),
]
现在就可以在浏览器中输入http://127.0.0.1:8000/hello,就可以访问该视图了。
这是使用第一种方式进行url配置的,但是并不推荐这种方式,因为如果将每个应用的url全部配置在根UrlConf中,随着项目越来越庞大,url会变得非常混乱。应该使用第二种方式,在根UrlConf中,通过include()
函数来引入每个应用的UrlConf,这样当根UrlConf中匹配成功后,会通过include()在对应的应用中进行匹配。使用这种方式创建url如下:
path('hello/', include('polls.urls')),
引入了polls.urls.py,在polls.urls.py中:
from . import views
path('', views.helloword),
这两种方式的配置都属于原始配置,在之后的学习中,会使用Rooter进行url的配置,这也是项目开发中经常使用的方式。
Django中,除200外,每个响应码都有对应的一个类,这些类都是HttpResponse的子类,如:
def get_student(requset):
try:
stu1 = Student.objects.get(name='Little.Hong')
except Student.DoesNotExist:
return HttpResponseNotFound('Page not found
')
else:
return HttpResponse("name:{0},age:{1}".format(stu1.name, stu1.age))
此外,对于常见的404错误,除了使用HttpResponseNotFound以外,还可以抛出Http404异常进行处理:
from .models import Student, classRoom
from django.http import Http404
def get_student(requset):
try:
stu1 = Student.objects.get(name='Little')
except Student.DoesNotExist:
raise Http404("page not found")
else:
return HttpResponse("name:{0},age:{1}".format(stu1.name, stu1.age))