Django的视图有两种形式 : FBV与CBV
FBV 是基于函数的视图 (function base views)
CBV 是基于类的视图(class base views)
- 视图函数 current_datetime,每个视图函数都将一个HttpRequest 对象作为其第一个参数,该参数通常被命名request
- 视图函数的名称无关紧要,它不必以某种方式命名,以便Django能够识别它,但是函数命名一定要能够清晰的描述它的功能
- 视图函数返回一个HttpResponse响应的对象,每个视图函数负责返回一个HttpResponse对象
- ---------------------------------------------------------------------------------------------------------------------------
- CBV提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get(),post()等)
- 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多 if 判断,可以提高代码可读性
# urlconf 中
urlpatterns = [
path('fbv/', views.current_datetime),
]
# views 中
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)
# =====================================
# urlconf 中
urlpatterns = [
# 一定要使用 as_view() ,记住 小括号
path('cbv/', views.MyView.as_view()),
]
# views中
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
return HttpResponse('get OK')
def post(self, request):
return HttpResponse('post OK')
返回错误相应
- 返回 HttpResponseNotFound
- 返回 HttpResponse 设置 status 状态码
- 返回 Http404状态对象
from django.shortcuts import render
from django.http import HttpResponseNotFound
# Create your views here.
# 使用 HttpResponseNotFound
def error1(request):
return HttpResponseNotFound('<h1>Page not found</h1>')
# 还可以直接返回状态码
from django.http import HttpResponse
def error2(request):
return HttpResponse(status=404)
# 特殊的 404 错误
from django.http import Http404
from django.shortcuts import render
def error3(request, poll_id):
print(type(poll_id))
raise Http404(f"Model does not exist,{poll_id}")
return HttpResponse('<h1>Page was found</h1>')
视图装饰器
@require_http_methods,要求视图只接收指定的http方法
@require_GET():仅仅允许GET方法
@require_POST():仅仅允许POST方法
@require_safe():仅仅允许GET和HEAD方法
from django.views.decorators.http import require_http_methods
# 允许 GET和POST方法, 默认就是所有方法都支持
@require_http_methods(["GET", "POST"])
def my_view(request):
pass
# 只允许GET访问
@require_GET()
def g_e_t(request):
pass
@login_required
必须登录才能访问装饰的视图函数,
用户未登录,则重定向到settings.LOGIN_URL,除非指定了login_url参数,例如:@login_required(login_url='/polls/login/')
# 在settings.py文件中添加
LOGIN_URL = "/go_login/"
'''
之后在视图函数中创建该路由,如果用户没有登录就会自动跳转到这个go_login页面
至于怎么知道用户登录没,还没学,等着吧
'''
@login_required
def my_view(request):
pass
# 或者
@login_required(login_url = "/go_login/")
def my_view(request):
pass
请求对象HttpRequest
属性(除非另有说明,否则所有属性均应视为只读):
-
HttpRequest.scheme:
表示请求使用的协议(http或https)
-
HttpRequest.body:
原始HTTP请求主体,类型是字节串。处理数据一些非html表单的数据类型很有用,譬如:二进制图像,XML等;
- 取form表单数据,请使用 HttpRequest.POST
- 取url中的参数,用HttpRequest.GET
-
HttpRequest.path:
表示请求页面的完整路径的字符串,不包括scheme和域名。
例: "/music/bands/the_beatles/"
-
HttpRequest.method:
表示请求中使用的HTTP方法的字符串,是大写的。例如:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
-
HttpRequest.encoding:
表示当前编码的字符串,用于解码表单提交数据(或者None,表示使用该DEFAULT_CHARSET设置)。
可以设置此属性来更改访问表单数据时使用的编码,修改后,后续的属性访问(例如读取GET或POST)将使用新encoding值。
-
HttpRequest.content_type:
表示请求的MIME类型的字符串,从CONTENT_TYPE解析 。
-
HttpRequest.content_params:
包含在CONTENT_TYPE 标题中的键/值参数字典。
-
HttpRequest.GET:
包含所有给定的HTTP GET参数的类似字典的对象。请参阅QueryDict下面的文档。
-
HttpRequest.POST:
包含所有给定HTTP POST参数的类似字典的对象,前提是请求包含表单数据。请参阅QueryDict文档。POST不包含文件信息,文件信息请见FILES。
-
HttpRequest.COOKIES:
包含所有Cookie的字典,键和值是字符串。
-
HttpRequest.FILES:
包含所有上传文件的类似字典的对象
-
HttpRequest.META:
包含所有可用HTTP meta的字典
中间件设置的属性:
Django的contrib应用程序中包含的一些中间件在请求中设置了属性。如果在请求中看不到该属性,请确保使用了相应的中间件类MIDDLEWARE
-
HttpRequest.session:
来自SessionMiddleware:代表当前会话的可读写字典对象。
-
HttpRequest.site:
来自CurrentSiteMiddleware: 代表当前网站的实例Site或 RequestSite返回get_current_site()
-
HttpRequest.user:
来自AuthenticationMiddleware:AUTH_USER_MODEL代表当前登录用户的实例
详细参考官方文档请求和响应对象 | Django 文档 | Django
QueryDict对象
获取单个数据
- queryDict.get(key) 如果键有多个值,获取的值为最后一个值
- queryDict[key] 如果键有多个值,获取的值为最后一个值
-
获取多个数据
- queryDict.getlist(key)
-
获取key与value
- list(queryDict.items()) 如果键有多个值,获取的值为最后一个值
from django.http import HttpResponse
def query_index(request):
# 获取参数
params = request.GET
# 打印params类型
print(type(params)) # <class 'django.http.request.QueryDict'>
# 获取单个值
s_value1 = params.get('a') # 推荐
s_value2 = params['a'] # 如果没有值,会报错
s_value3 = params.get('c')
# 获取多个值
m_value = params.getlist('c')
# 同时获取key 与 value
kv_value = list(params.items())
# 返回结果
return HttpResponse(f'request.GET:{params}<br/>类型是:{type(params)}<br/>s_value1:{s_value1}<br/>s_value2:{s_value2}<br/> s_value3:{s_value3} <br/> m_value:{m_value}<br/>kv_value:{kv_value}')
HttpResponse相应对象
from django.http import HttpResponse
response = HttpResponse("Here's the text of the web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")
response = HttpResponse(b'Bytestrings are also accepted.')
-
HttpResponse.content:
表示响应的字符串
-
HttpResponse.charset:
表示响应将被编码的字符集,如果在HttpResponse实例化时没有给出,则会从中提取 content_type,如果没有设置content_type,则使用settings.DEFAULT_CHARSET
-
HttpResponse.status_code:
该响应的 HTTP 状态码
-
HttpResponse.reason_phrase:
响应的HTTP原因描述语,使用HTTP标准的默认原因描述语 除非明确设置,否则reason_phrase由 status_code 决定。
-
HttpResponse.streaming:
总是False,中间件通过此属性可以区分流式响应与常规响应
-
HttpResponse.closed:
如果response已经结束,则返回True,否则返回False
from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'})
print(response.content) # 打印 b'{"foo": "bar"}'
FileResponse对象(文件资源)
import os
from django.conf import settings
from django.http import FileResponse
def resp_file(request):
file_path = os.path.join(settings.BASE_DIR,'imgs/tu1.png')
return FileResponse(open(file_path,'rb'),filename='tu1.png')
返回模板templates
-
必需的参数
- request:用于生成此响应的请求对象
- template_name:要使用的模板的全名或模板名称的列表
-
可选参数
- context:要添加到模板上下文的值的字典。默认情况下,这是一个空字典。如果字典中的值是可调用的,视图将在渲染模板之前调用它
- content_type:用于生成文档的MIME类型。默认为DEFAULT_CONTENT_TYPE设置的值
- status:响应的状态码。默认为200
- using:用于加载模板的模板引擎名
- 整体流程,子应用中创建templates文件夹,在主应用settings中配置TEMPLATES的DIRS路径,之后在templates文件夹中创建html文件。
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
# Create your views here.
def template1(request):
return render(request, '子应用/index.html',{'name':'郑大帅'})
def template2(request):
t = loader.get_template('子应用/index.html')
c = {'name':'张小美'}
return HttpResponse(t.render(c,request),content_type="text/html; charset=utf-8")
请求重定向
访问url已经过期,帮用户自动重定向到新url
from django.shortcuts import redirect
def my_view(request):
return redirect('https://www.itbaizhan.com/')
def my_view(request):
return redirect('/some/url/')
# 使用这种方式节约维护开发成本,只要重定向别名不变,前面可以随意改变
def my_view(request):
return redirect('polls:index', foo='bar')
'''
默认情况下,redirect()返回一个临时重定向(302)。
如果要设置永久重定向(301)设置permanent参数;为True即可
'''
def my_view(request):
return redirect('polls:index', permanent=True)
get_object_404函数
找不到数据或者匹配不到数据就会返回404页面,提供便捷写法
-
必需的参数
- klass:一Model类或一个Manager或QuerySet从哪个实例来获取对象
- **kwargs:查找参数,应该采用get()或filter()的参数
from django.shortcuts import get_object_or_404
from .models import Salary
def my_view(request):
poll = get_object_or_404(klass = Salary, pk=1)
#等同于
def my_view(request):
try:
poll = Salary.objects.get(pk=1)
except Salary.DoesNotExist:
raise Http404()
内置通用视图
有一个通用的模板,方便从数据库获取数据并传递给templates页面,具体要看点源码。看看别人返回了什么,包括视图说明
也能自己手搓获取数据并显示,模板只是提供便捷.解决掉重复的开发
具体有
__all__ = [
'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
]
template文件夹中的html怎么在前端页面显示
# template(detail.html)
{{object}}
# template(list.tml)
{{object_list}}
from django.shortcuts import render
from error_app.models import Salary
# Create your views here.
from django.views import generic
# 获取单条数据
class MyDetailView1(generic.DetailView):
# 设置要返回哪个model的数据
model= Salary
# 设置让哪个模板渲染数据
template_name='detail.html'
class MyDetailView2(generic.DetailView):
# 设置要返回哪个model的数据
queryset= Salary.objects.all()
# 设置让哪个模板渲染数据
template_name='detail.html'
# 获取多条数据
class MyListView(generic.ListView):
# 设置要返回哪个model的数据
model= Salary
# 设置让哪个模板渲染数据
template_name='list.html'
标签:HttpRequest,request,视图,django,import,HttpResponse,Django,def
From: https://blog.csdn.net/weixin_65791897/article/details/143110376