|
| 1 | +* 视图是一个python函数,接收web请求并返回一个web响应。 |
| 2 | +* 响应可以是HTML页面,或者重定向,或者404和其他任何内容。 |
| 3 | +* 约定将视图放在views.py下面。 |
| 4 | + |
| 5 | +### 1.一个简单的视图 |
| 6 | +* 每个视图都会将HttpRequest对象作为第一个参数,通常名为request。 |
| 7 | +* 视图返回一个包含生成的响应的HttpResponse对象。 |
| 8 | + |
| 9 | +```python |
| 10 | +from django.http import HttpResponse |
| 11 | +import datetime |
| 12 | + |
| 13 | +def current_datetime(request): |
| 14 | + now = datetime.datetime.now() |
| 15 | + html = "<html><body>It is now %s.</body></html>" % now |
| 16 | + return HttpResponse(html) |
| 17 | +``` |
| 18 | + |
| 19 | +### 2.url与视图映射 |
| 20 | +[URL调度器](URL调度器.md) |
| 21 | +### 3.HttpResponseNotFound 与 Http404 |
| 22 | +##### HttpResponseNotFound |
| 23 | +**HttpResponseNotFound返回错误时需要定义错误页面的HTML。** |
| 24 | +```python |
| 25 | +from django.http import HttpResponse, HttpResponseNotFound |
| 26 | +def my_view(request): |
| 27 | + if foo: |
| 28 | + return HttpResponseNotFound('<h1>Page not found</h1>') |
| 29 | + else: |
| 30 | + return HttpResponse('<h1>Page was found</h1>') |
| 31 | +``` |
| 32 | +##### Http404 |
| 33 | +**Django提供Http404异常。如果你在视图的任何地方引发了Http404,Django会捕捉到它并且返回标准的错误页面,连同HTTP错误代码 404 。** |
| 34 | +```python |
| 35 | +from django.http import Http404 |
| 36 | +from django.shortcuts import render |
| 37 | +from polls.models import Poll |
| 38 | +def detail(request, poll_id): |
| 39 | + try: |
| 40 | + p = Poll.objects.get(pk=poll_id) |
| 41 | + except Poll.DoesNotExist: |
| 42 | + raise Http404("Poll does not exist") |
| 43 | + return render(request, 'polls/detail.html', {'poll': p}) |
| 44 | +``` |
| 45 | + |
| 46 | +### 4.视图装饰器 |
| 47 | +##### 允许的HTTP方法 |
| 48 | +* require_http_methods(request_method_list): 限制视图只接受特定的请求方法。 |
| 49 | +* require_GET(): 只接受GET请求。 |
| 50 | +* require_POST(): 只接受POST请求。 |
| 51 | +* require_safe(): 只接受GET和HEAD请求。 |
| 52 | +```python |
| 53 | +from django.views.decorators.http import require_http_methods |
| 54 | +@require_http_methods(["GET", "POST"]) |
| 55 | +def my_view(request): |
| 56 | + pass |
| 57 | +``` |
| 58 | + |
| 59 | +##### GZip压缩 |
| 60 | +* gzip_page():如果浏览器允许 gzip 压缩,那么这个装饰器将压缩内容。 |
0 commit comments