python后台架构Django教程--视图views渲染

前面的部分我们已经创建了一个名为hello的django项目和一个名为app1的应用,以及连接了mysql数据库,在app1中添加了User和Diary两个数据模型。

视图函数的实现在每个功能模块的views.py文件中实现。视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应。

响应的内容可以是HTML网页、重定向、404错误,XML文档或图像等任何东西。但是,无论视图本身是个什么处理逻辑,最好都返回某种响应。

视图函数的代码写在哪里也无所谓,只要它在你的Python目录下面。但是通常我们约定将视图放置在项目或app应用目录中的名为views.py的文件中。

view.py中每个视图函数的主要工作为接收request参数,request中包含前台请求数据。通过对请求数据进行逻辑运算,读写数据库等过程获取响应数据。将响应数据以字符串、对象、或html页面的形式返回。

在这个过程中包含了

  • 1.获取请求数据、 2、数据库读写、逻辑运算、产生响应数据, 3、视图渲染

等过程。不过有可能会遇到

  • 1、数据查询失败的404错误, 2、重定向。

等问题。

捕获请求——HttpRequest对象

每当一个用户请求发送过来,Django将HTTP数据包中的相关内容,打包成为一个HttpRequest对象,并传递给每个视图函数作为第一位置参数,也就是request,供我们调用,这一过程是系统自动完成的。
例如:前台请求数据包含username和password两个字段。

# 接收请求数据返回字符串响应
def index(request):
    if request.method == "POST":
        username = request.POST.get("username", None)   # 读取post数据,None为默认值
        password = request.POST.get("password", None)   # 读取post数据,None为默认值
    if request.method == "GET":
        username = request.GET.get("username", None)   # 读取get数据
        password = request.GET.get("password", None)  # 读取get数据
    ...

在获取数据时,通常会提供一个默认值,防止请求数据中没有目标属性时触发KeyError异常。

不仅如此,HttpRequest对象中包含了非常多的重要的信息和数据,应该熟练掌握它。

1、HttpRequest属性

(1)、 HttpRequest.scheme
字符串类型,表示请求的协议种类,’http’或’https’。

(2)、 HttpRequest.body
bytes类型,表示原始HTTP请求的正文。它对于处理非HTML形式的数据非常有用:二进制图像、XML等。如果要处理常规的表单数据,应该使用HttpRequest.POST。还可以使用类似读写文件的方式从HttpRequest中读取数据,参见HttpRequest.read()。

(3)、 HttpRequest.path
字符串类型,表示当前请求页面的完整路径,但是不包括协议名和域名。例如:”/music/bands/the_beatles/”。这个属性,常被用于我们进行某项操作时,如果不通过,返回用户先前浏览的页面。非常有用!

(4)、 HttpRequest.path_info
在某些Web服务器配置下,主机名后的URL部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web服务器是什么。使用它代替path可以让代码在测试和开发环境中更容易地切换。
例如,如果应用的WSGIScriptAlias设置为/minfo,那么HttpRequest.path等于/music/bands/the_beatles/ ,而HttpRequest.path_info为/minfo/music/bands/the_beatles/。

(5)、HttpRequest.method
字符串类型,表示请求使用的HTTP方法。默认为大写。 像这样:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()

通过这个属性来判断请求的方法,然后根据请求的方法不同,在视图中执行不同的代码。

(6)、HttpRequest.encoding
字符串类型,表示提交的数据的编码方式(如果为None 则表示使用DEFAULT_CHARSET设置)。 这个属性是可写的,可以通过修改它来改变表单数据的编码。任何随后的属性访问(例如GET或POST)将使用新的编码方式。

(7)、HttpRequest.content_type
Django1.10中新增。表示从CONTENT_TYPE头解析的请求的MIME类型。

(8)、HttpRequest.content_params
Django 1.10中新增。包含在CONTENT_TYPE标题中的键/值参数字典。

(9)、HttpRequest.GET
一个类似于字典的对象,包含GET请求中的所有参数。 详情参考QueryDict文档。

(10)、HttpRequest.POST
一个包含所有POST请求的参数,以及包含表单数据的字典。 详情请参考QueryDict文档。 如果需要访问请求中的原始或非表单数据,可以使用HttpRequest.body属性。

注意:请使用if request.method == “POST”来判断一个请求是否POST类型,而不要使用if request.POST。

POST中不包含上传文件的数据。

(11)、HttpRequest.COOKIES
包含所有Cookie信息的字典。 键和值都为字符串。可以类似字典类型的方式,在cookie中读写数据,但是注意cookie是不安全的,因此,不要写敏感重要的信息。

(12)、HttpRequest.FILES
一个类似于字典的对象,包含所有上传的文件数据。 FILES中的每个键为<input type="file" name="" />中的name属性值。 FILES中的每个值是一个UploadedFile。

要在Django中实现文件上传,就要靠这个属性!

如果请求方法是POST且请求的<form>中带有enctype=”multipart/form-data”属性,那么FILES将包含上传的文件的数据。 否则,FILES将为一个空的类似于字典的对象,属于被忽略、无用的情形。

下面为使用模型处理上传的文件的一个示例。

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField

def upload_file(request):
    if request.method == 'POST':
        form = ModelFormWithFileField(request.POST, request.FILES)
        if form.is_valid():
            # 这么做就可以了,文件会被保存到Model中upload_to参数指定的位置
            form.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = ModelFormWithFileField()
    return render(request, 'upload.html', {'form': form})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值