Django入门——视图函数

Django入门——视图函数

迟到的更新

视图函数

概述

A view function, or view for short, is simply a Python function that takes a Web request and returns a Web response. This response can be the HTML contents of a Web page, or a redirect, or a 404 error, or an XML document, or an image . . . or anything, really. The view itself contains whatever arbitrary(任意的)logic is necessary to return that response.
the convention is to put views in a file called views.py, placed in your project or application directory.

文档里说的很清楚,view(视图函数)的功能就是一个Python的函数,它接受请求(request),作为函数的第一个参数,然后返回一个响应(response)
而我们的逻辑(logic)就写在函数体里

写法

HTTPResponse

以文档的例子:

1
2
3
4
5
6
7
from django.http import HttpResponse
import datetime

def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
  • request是一个HttpRequest对象,具体这个对象的定义,需要阅读代码
  • return HTTPResponse就是我们所说的返回一个response响应,Django对它进行了封装,就是我们看到的HTTPResponse
  • 有了这个逻辑函数,你在urls.py里的urlconf用path对应一下,将所有请求某个url的逻辑全部交给它来处理,这就是view层负责的工作

HTTPResponse继承自HttpResponseBase

属性有:

  • content:表示返回的内容
  • charset:response采用的编码字符集
  • status:响应的HTTP状态码(在django1.x为status_code)
  • content_type:指定响应头里的Content-Type,即返回数据的类型

Content-Type
Http Header里的Content-Type一般有这三种:

application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data: 传输文件。
text/plain: 数据以纯文本形式进行编码
application/json :json格式

form表单的enctrype属性即为编码方式,
常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
jquery的ajax方法默认使用application/x-www-form-urlencoded
当请求的Content-Type为application/x-www-form-urlencoded浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),同理为application/json时会转换为json数据格式

1
2
3
# 自然返回的是hello几个字
def test(request):
return HttpResponse(content="hello", status=200, content_type="text/plain")

常用方法有:

  • set_cookie(key, value=‘’, max_age=None, expires=None, path=‘/’, domain=None, secure=False, httponly=False, samesite=None)

  • delete_cookie(key, path=‘/’, domain=None)

    • 挑几个重要的参数说:
      • max_age:持续最大时间
      • expires:过期时间
      • domain:请求的域名
  • write(content):以文件的方式写

render&redirect

  • render是HTTPResponse的一个简写函数,它渲染指定的html然后返回(当然返回的也是HTTPResponse对象)
  • redirect是HTTPResponseRedirect的简写函数,由后端发起一个重定向,将访问指定的url

redirect(to, args, kwargs)
推荐使用reverse解析
reverse(viewname, urlconf, args, kwargs, current_app)
使用reverse就是解析你的url里的name然后获取url来填入重定向的url,当然,kwargs是和path的捕获组相对应,通过这样来指定捕获组的内容,这个参数会被接着传给重定向的url的处理函数里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# views.py
def test(request):
content_type="text/plain")
return redirect(reverse("demo:ha", kwargs={"name": "cyx"}))

# 主路由urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('demo/', include(('demo.urls', 'demo'), namespace='demo')),
]

# demo.urls.py
urlpatterns = [
path('test/<str:name>/', test2, name="ha")
]

Http404 exception

当我们想返回一个404页时使用
return HttpResponseNotFound('<h1>Page not found</h1>')

或者
raise Http404("Poll does not exist")

这个错误只会在debug时显示出来

关于404页官方文档的描述

in order to show customized HTML when Django returns a 404, you can create an HTML template named 404.html and place it in the top level of your template tree. This template will then be served when DEBUG is set to False.

当我们关闭debug模式时,我们只需要在template里创建一个404.html,所有的404页都会调用它

request

这个就有很多能说的,这里只列举常用的:

request.session

操作session,可以通过键值对的方式向里面添加元素

1
2
3
4
5
6
request.session['key'] = value # 设置键值对
request.session.get('key', default=) # 获取键值对
request.session.clear() # 清空此次会话的所有保存值
request.session.set_expiry(value) # 设置session过期时间
# value为整形,表示秒
# 不填默认为2周后过期

request.method

获取请求的方法,GET或者POST,可以通过它和if来使不同请求在一个views函数里处理好

  • request.POST.get获取用户POST的内容
  • request.GET.get获取GET的参数
    (自动urldecode过了)

request.FILE

request.FILE获取的是传入的所有的文件,他们以上传的文件名和二进制数据保存在里面

可以用下面的方法获取数据:

1
2
3
4
5
6
7
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)

# view里有这个
handle_uploaded_file(request.FILES['file_name'])

待补充

想到了再加

views函数修饰器

你完全可以自己写,比如一个限制所有网站访问权限的修饰器

Django给你提供了一些视图函数修饰器:

  • require_http_methods(request_method_list)

Decorator to require that a view only accepts particular request methods.

doc的代码示例:

1
2
3
4
5
6
7
from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass
  • require_GET()

Decorator to require that a view only accepts the GET method

  • require_POST()

Decorator to require that a view only accepts the POST method

  • gzip_page()

GZip 压缩

  • cache_control()

装饰器通过添加所有关键字参数来修补响应的 Cache-Control 头

  • never_cache(view_func)

告诉浏览器不缓冲页面

后记

doc这一个部分写的是真的少,都靠我当时学校1.11时的笔记和实践来补充的一些内容,深夜更新

Author

Ctwo

Posted on

2019-10-26

Updated on

2020-10-25

Licensed under

Comments