Python3 --- Django创建视图

一、URL配置

项目中找到settings.py配置文件,该配置文件中的ROOT_URLCONF指定的是根路径的配置文件,如下:

ROOT_URLCONF = 'test3.urls'

该信息指定的是根路径的配置文件是test3项目下的urls.py文件,如下:

from django.conf.urls import url,include
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path(r'admin/', admin.site.urls),
    path(r'booktest/', include('booktest.urls')),
]

这里指定了2个path地址:

  • 第一个是python提供的管理界面的访问地址
  • 第二个是配置的应用booktest的url配置文件地址


booktest的url配置文件内容如下:

from django.conf.urls import url
from booktest import views

urlpatterns = [
    url('index/', views.index),
    url('\d+/', views.detail)
]
这里提供了2个地址,第一个是index的访问地址,以及detail的访问地址


二、创建视图

视图是创建在应用的views.py文件中,创建的视图需要与urls.py文件中配置的url地址匹配,并且与templates中的页面匹配才能正常访问

2.1、


此时配置完成可以启动服务:

python manage.py runserver 8000

三、错误视图

Django原生自带几个默认视图用于处理HTTP错误,需要注意如下配置:

  • 配置模板路径: settings.py中修改: 'DIRS': [os.path.join(BASE_DIR), 'templates'],
  • 修改调试模式: settings.py中修改: DEBUG = False
  • 修改允许谁请求该主机: settings.py中修改: ALLOWED_HOSTS = ['*']
  • templates中创建错误视图: 404(页面丢失) / 500(服务出错) / 400(请求错误) / 403(权限不足)


四、HttpRequest对象

当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。

Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。示例如下:

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse(request.path)

def detail(request):
    return HttpResponse('hello world')

# 展示链接的页面
def getTest1(request):
    return render(request, 'booktest/getTest1.html')

# 接收一键一值的情况
def getTest2(request):
    # 根据建接收值
    a = request.GET['a']
    b = request.GET['b']
    c = request.GET['c']

    # 构造上下文
    context = {'a':a,'b':b,'c':c}

    # 向模板中传递上下文,并进行渲染
    return render(request, 'booktest/getTest2.html',context)

# 接收一键多值的情况
def getTest3(request):
    # 根据建接收值
    a = request.GET.getlist('a')

    # 构造上下文
    context = {'a': a}
    return render(request, 'booktest/getTest3.html',context)

def postTest1(request):
    return render(request, 'booktest/postTest1.html')

def postTest2(request):
    uname = request.POST['uname']
    upwd = request.POST['upwd']
    ugender = request.POST.get('ugender')
    uhobby = request.POST.getlist('uhobby')
    context = {'uname':uname,'upwd':upwd,'ugender':ugender,'uhobby':uhobby}
    return render(request, 'booktest/postTest2.html',context)

HttpRequest属性:

Python3 --- Django创建视图_第1张图片

HttpRequest方法:

Python3 --- Django创建视图_第2张图片


五、QueryDict对象

在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。 QueryDict类似字典的自定义类,用来处理单键对应多值的情况。因为一些HTML form元素,例如,, 就会传多个值给单个键。

QueryDict对象是immutable(不可更改的),除非创建它们的copy()。这意味着我们不能直接改变request.POST and request.GET的属性。

QueryDict方法:

Python3 --- Django创建视图_第3张图片


六、HttpResponse对象

        对于HttpRequest对象来说,是由Django自动创建。但是,HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。HttpResponse类在django.http.HttpResponse。


HttpResponse属性:

Python3 --- Django创建视图_第4张图片


HttpResponse方法:

Python3 --- Django创建视图_第5张图片


HttpResponse子类:

Python3 --- Django创建视图_第6张图片


七、JsonResponse对象

        Json是目前常用的一种数据格式,有时候我们需要返回一个Json格式的数据,而 JsonResponse 提供了一个快捷的方法。它是 HttpResponse 的一个子类,用来帮助用户创建JSON 编码的响应。它从父类继承大部分行为,下面看起构造函数:

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs) 


参数说明:

  • data:应该传递一个标准的 python 字典给它,它将其转换成 json 格式的数据。
  • encoder:默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。关于这个序列化的更多信息参见JSON 序列化。
  • safe : 默认为True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)。如果safe 为True,而第一个参数传递的不是dict 对象,将抛出一个TypeError。
  • json_dumps_params:在1.9版本中新增,可以传递一个python标准的 json 库中,json.dump() 方法处理后的对象给它,用于生成一个响应。
  • 另外:它的默认 Content-Type 头部设置为application/json。

示例:

>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
'{"foo": "bar"}'

八、StreamingHttpResponse对象

        StreamingHttpResponse类被用来从Django流式化一个响应(response)到浏览器。当生产的响应太长或者占用太多的内存的时候,你可能会使用到它。例如,它对于生成大型CSV文件非常有用。

性能方面的考虑:
  django是为了短链接而设计的,也就是说每次响应完毕之后都会断开连接。流式响应将会为整个响应期协同工作进程。这可能导致性能变差。总的来说,你需要将代价高的任务移除 请求—响应 的循环,而不是求助于流式响应。

StreamingHttpResponse 不是 HttpResponse 的衍生类(子类),因为它实现了完全不同的应用程序接口(API)。尽管如此,除了以下的几个明显不同的地方,其他几乎完全相同:

  • 应该提供一个迭代器给它,这个迭代器生成出字符串将用来构成内容(content)
  • 你不能直接访问它的内容(content),除非迭代响应对象本身。这只在响应被返回到客户端的时候发生。
  • 它没有 content 属性。取而代之的是,它有一个 streaming_content 属性。
  • 你不能使用类似文件对象的tell()或者 write() 方法。那么做会抛出一个异常
StreamingHttpResponse 应该只在下面的情况下使用:请求是独立的,并且整个内容是不能重复的,在发生给客户端之前。因为其内容(content)是不能访问的,所以很多中间件是无法正常工作的。例如:ETag 和 Content- Length 首部就不能在流式相应中生成。


属性:

StreamingHttpResponse.streaming_content:一个迭代器,包含内容字符串。
StreamingHttpResponse.status_code:响应的状态码
StreamingHttpResponse.reason_phrase:响应的原因短语
StreamingHttpResponse.streaming:总是True,表示其是一个流式响应。


九、FileResponse对象

        FileResponse是StreamingHttpResponse的衍生类(子类),为二进制文件做了优化。如果 wsgi server 来提供,则使用了wsgi.file_wrapper ,否则将会流式化一个文件为一些小块。


示例:(FileResponse 需要通过二进制模式打开文件)

>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))


你可能感兴趣的:(Python3,------,Django)