13.Django之view初探视图函数(一)

1、什么是视图函数?
Django框架中的视图函数其实就是个普通的python函数,这个函数能够接收web请求,而且返回web响应。
视图函数响应给客户端浏览器的内容,能够是一个html文档,还能够是一个重定向,还能够是一张图片,还能够是一个重定向......
不管视图函数中包含什么样的逻辑,都须要返回web响应。
通常状况下,咱们喜欢把视图函数放在views.py这个文件中。html

2、初识视图函数的执行流程与结构。
from django.shortcuts import render
from django.shortcuts import redirect
from django.http import HttpResponse
from django.urls import reverse
import datetimepython

def show_datetime(request):
now = datetime.datetime.now()
html = "< html >< body >*It is now %s.< /body >< /html >" % now
print(request)
return HttpResponse(html)web

(1)首先,咱们从 django.http模块导入了HttpResponse类,以及Python的datetime模块。
(2)接着,咱们定义了show_datetime函数。它是一个视图函数。每一个视图函数都应接收HttpRequest对象做为第一个参数,通常叫作request。
(3)最终,这个视图函数会返回出一个HttpResponse(响应)对象。(每一个视图函数都要返回一个HttpResponse对象)django

(也就是说,每一个视图函数至少要接收一个参数,接收的这个参数就是HttpRequest【http请求对象】,另外,每一个视图函数也要返回一个对象,这个对象就是 HttpResponse【http响应对象】 )浏览器

http请求对象(HttpRequest)与http响应对象:HttpResponse这两个对象的所在位置是django.http。服务器

3、view视图函数中经常使用的快捷函数。框架

一、 render函数。
结合django模板,返回一个通过django模板语言渲染的HttpResponse 对象。
render的经常使用参数以下:
格式 render(request, template_name[, context])ide

request:render函数要传的第一个参数就是用来生成这个响应的请求对象。
template_name :返回给浏览器的模板名称,这个名称是字符串格式。(这个参数是可选的。)
context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它。(说的通俗一点,就是给模板传递python变量或者指定的值,替换掉指定的字符串。)函数

content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。post

status:用来指定http的响应的状态码。默认为200。

  1. redirect函数。
    用于跳转到指定的url,这个url必须是django的url路由系统中定义好的url。
    示例:
    def auth_user(request):
    if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')
    print(username,password)
    print(request.POST)
    if username == "admin" and password == "123456":
    return redirect('/test/admin/') # 当上面这个if判断执行成功后,自动跳转到/test/admin/这个url。
    return render(request,'login.html')

4、获取httprequest内容的方法(获取请求体内容)。
1.获取当前请求类型:
request.method
例如说,如今须要判断当前请求是否为post类型:
if request.method == 'POST':

2.获取get请求或者post请求的内容。
若是须要获取POST请求的全部内容,可使用request.POST这个方法,使用了request.POST以后,会将post请求的全部内容以QueryDict这种类型返回,这个数据类型和python内置的字典特别相似,若是须要取出post请求中的某个值,可使用request.POST.get('key')方法,取出QueryDict这个字典中指定的值。
示例:
def auth_user(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
print(username,password)
print(request.POST)
if username == "admin" and password == "123456":
return redirect('/test/admin/')
return render(request,'login.html')

若是须要获取客户端浏览器提交的GET请求中的值,须要使用http请求的 request.GET方法,获取GET请求的值没什么好须要特殊介绍的了,用法和request.POST同样,也会返回一个QueryDict字典,要取出字典中的某个值,就使用get()方法。

3。获取form表单中checkbox中全部的值。
当须要获取form表单中的checkbox勾选框中全部的值时,就不能在使用.get方法了!
这一点须要特别注意!
当须要接收checkbox中的值,若是使用以前的request.POST.get()方法,若是使用checkbox多选框,那么只会接收到checkbox的第一个值!其他的值没法接收!!
这个时候就须要使用request.POST.getlist()方法!
假如说,如今须要得到form表单中,同一个name属性中的多个值,或者说是QueryDict字典中同一个key里面的多个value,这个时候就须要使用request.POST.getlist()方法!。
当使用了request.POST.getlist()方法后,同一个key中的多个值,会以列表的方式返回。
下面是个例子:
HTML部分:
< body >
< form action="/test/login2/" method="post" >

< p >
    选择1:<input type="checkbox" name="c1" value="1">
    选择2:<input type="checkbox" name="c1" value="2">
    选择3:<input type="checkbox" name="c1" value='3'>
</p>
<input type="submit" value="提交">

< /form>
</ body>

view视图函数部分:
def test_check(request):
if request.method == 'POST':
t_check = request.POST.getlist('c1') #获取key为c1的全部值。
print(request.POST)
print(t_check)
return render(request,'login.html')

这时,咱们打开浏览器,选中3个checkbox 而后提交,这时t_check这时获取到的值将会是一个列表['1', '2', '3']。

4.经过form表单实现上传文件。
django接收form表单传过来的文件,则须要request.FILES方法。
下面是文件上传功能的示例:
【1】html文档:
< body>
< form enctype="multipart/form-data" method="post">
< input type="file" name="up_load_file"/>
< input type="submit" value="上传" >
< /form >
< /body >

注意!!:在制做上传文件的form表单时,必定要注意添加enctype="multipart/form-data"这个属性!!不然会致使文件没法上传!!这个属性的做用就是用来设置,form表单提交给服务器的媒体类型!!

【2】view视图:
def upload_file(request):
if request.method == 'POST':
upfile = request.FILES.get('up_load_file')
write_file = open(upfile.name,mode='wb')
for item in upfile.chunks(): #!chunks生成迭代器对象。
write_file.write(item)
write_file.close()
return render(request,'upload.html')

#!注意!!!!!当equest.FILES.get接收到了form表单传送过来的文件对象时,执行这个文件对象的chunks方法,就会生成一个迭代器对象,只要循环这个迭代器对象,就能够获取到文件中的内容。

5、经过另外一种方式建立view视图(经过类的方式建立视图)。
下面是经过类(class)的方式建立视图函数的方法。

经过类建立的view视图,建立方法以下:
from django.views import View
class Test(View):
def get(self,request):
print('当浏览器发起get请求时执行我!')
def post(self,request):
print('当浏览器发起post请求时执行我!')

那么这个view视图的类如何在url路由中调用呢?
urlpatterns=[
url(r'^datetime/',views.show_datetime),
url(r'^login/',views.auth_user),
url(r'^admin/',views.admin),
url(r'^req/',views.http_req),
url(r'^upload/',views.upload_file),
url(r'^home/',views.Test.as_view()), #!!!注意看这里!!!

]

相关文章
相关标签/搜索