[Django] Django(四) View基础之函数视图

View层概述

Django中的视图层,负责处理用户的请求并返回响应。

Django的视图是可调用的对象,因此有两种方式的视图:通过Python函数实现的函数视图和通过Python类实现的类视图。通过视图,用户接受web请求,同时返回web响应。响应可以是文本、HTML页面、图像…….

视图的定义可以在项目的任意一个模块中,但是Django每个应用的views.py就是专门用来定义视图。

由于在之后的开发中,用的最多的实际上是DjangoREST中提供的视图,因此,对于初学者来说,此处仅仅了解下即可。

1.函数视图

函数视图是一个Python函数,接受一个HttpRequest类型的对象作为参数,返回包含生成的响应的HttpResponse对象,其格式如下:

from django.http import HttpRequest,HttpResponse

def func(request):
    ......
    return HttpResponse()

如何通过函数创建一个视图并当用户输入url时展示在页面呢?由以下两步就可以搞定

Step1.创建视图

在任意应用的views.py中:

from django.http import HttpRequest,HttpResponse
def helloword(request):
    return HttpResponse("Hello,Django!")

HttpRequest对象在请求时自动创建,HttpResponse则需要我们创建。

Step2.配置URL

在项目的配置文件(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的子类,如:

  • HttpResponsePermanentRedirect:301
  • HttpResponseNotModified:304
  • HttpResponseBadRequest:400
  • HttpResponseNotFound:404
  • HttpResponseForbidden:403
  • HttpResponseServerError:500
    因此在请求时如果需要处理错误,返回这些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))

你可能感兴趣的:(Django,REST,Framework)