#前言:
该文是Django十日计划中的视图篇,前几篇主要介绍了,Django的创建,Django各个文件的作用,以及Django的路由,感兴趣的可以去看我之前发的博客,欢迎任何指正和建议。如果您在我的博客中发现任何错误、不准确或者需要补充的地方,请不要犹豫,提出来让我知道。我认识到自己在语言表达、逻辑思维和知识储备方面都有待提高和学习,所以非常感谢您的反馈,这将帮助我改进并提升我的文章质量。
一、视图的介绍:
django 项目中视图就相当于 Python 函数或者类;Django 接收到浏览器的发送的请求之后, 进行 URL 匹配,找到对应的视图进行响应。
视图中第一个参数必须是 HttpRequest 的对象(正常情况下,我们默认写为 request)。
视图中必须返回一个 HttpResponse 对象或者其子类对象作为响应。
def index(request):
response = HttpResponse('index')
return response
def get_html(request):
# 模板化:将 html 文件转换为带有前端标签的字符串
# render 方法内部 , 将转换好之后的字符串使用 HttpResponse 对象进行返回,作为响应数据
return render(request , 'index.html')
def coll(request):
# redirect url 重定向 状态码:302
# redirect 方法内部返回的是 HttpResponse 的子类 : HttpResponseRedirect 对象
return redirect('www.baidu.com')
二、具体操作:
1、请求: HttpRequest:
HttpRequest 是 django 在视图中处理 HTTP 请求操作。
当浏览器发送请求到 django 中,django 接收到请求并且进行查询匹配对应的 URL,找到 URL 和 视图的映射关系之后。创建 HttpRequest 对象,将用户的请求数据封装到这个对象中,当触发到视图之后,这个对象会被作为第一个参数传入视图中。
下面我会以一个例子讲解:
def index(request):
# 获取请求方法:GET
print(request.method)
# 获取请求中的参数:GET
# 正常情况下, GET 和 POST 请求的参数会以键值对的方式封装在 request 中
# GET 请求的数据 ,用 ? 连接到 URL 后面 , 多个参数使用 & 连接
# /index/?name=ac&age=27
name = request.GET.get('name')
age = request.GET.get('age')
print(name , age)
print('='*20)
# 获取 URL 中的请求路径
# /index/ , 只获取当前视图请求的 URL , 不携带参数
url_path = request.path
# /index/?name=ac&age=27 , 获取当前视图请求的 URL 并且携带了参数
get_full_path = request.get_full_path()
print(url_path)
print('*'*20)
print(get_full_path)
response = HttpResponse('index')
return response
做一个简易登录界面的实例:
在templates文件底下创建一个html文件(这里我们以login.html为例子)
在html文件中,创建一个表单。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="submit" value="登录">
</form>
</body>
</html>
注意:我们用的是post请求,其中底下必须有个命令{% csrf_token %},不然无法进行post请求。
而在视图文件中:我们在此先不导入数据库,数据库操作会在后续讲解,在这我们以用户名(ac),密码(123)为例子。
def login_view(request):
if request.method=='GET':
return render(request,'login.html')
#上面这个操作就是说在这个页面发生了GET请求 就把数据返回到request里面,然后进行下面的操作
name=request.POST.get('username')
pwd=request.POST.get('password')
print(name,pwd)
if name=='ac'and pwd=='123':
return HttpResponse('登陆成功')
else:
return HttpResponse('登录失败')
当获取到html内容后:
就可以输入内容进行判断了。
2、响应:HttpResponse:
django 提供了 HttpResponse 子类作为响应状态 , 这些子类封装中 django.http 模块中
这里直接以代码为例子讲解:
from django.http import HttpResponseRedirect , HttpResponseForbidden
def status_302(request):
# HttpResponseRedirect 等同于 redirect
return HttpResponseRedirect('/login/')
def status_403(request):
return HttpResponseForbidden('请求被拒绝')
def status_404(request):
# 直接指定 HttpResponse 对象的响应状态码
return HttpResponse('404' , status=404)
HttpResponse 处理响应的内容:
def response_view(request):
# context_type 设置响应的文本格式 , 字符编码
# text/html; charset=utf-8 表示内容以 html 文本格式响应
# text/plain; charset=utf-8 表示内容以纯文本格式响应
return HttpResponse('<h1>你好 , 今晚一起去吃KFC</h1>' , content_type="text/plain; charset=utf-8")
3、类视图:
类视图,是把函数视图中封装的请求方法进行拆分,将不同的请求方法封装为一个独立的方法中。在类试图中,它有个很好的优点,就是不需要像上面的内容一样对post请求和get请求进行判断。
注意在使用类视图前先必须要导包:
from django.views import View
而这个View十分重要,在底下类的方法中参数都必须为View。
class MyView(View):#参数必须是View
#注意方法只能由post,get命名
#下面代码的意思就是发生get请求就调用get,post则调用post
def get(self,request):
return render(request,'index.html')
def post(self,request):
return HttpResponse("这是post请求")
class LoginView(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
name = request.POST.get('username')
pwd = request.POST.get('password')
print(name, pwd)
if name == 'ac' and pwd == '123':
return HttpResponse('登陆成功')
else:
return HttpResponse('登录失败')
注意:在对html页面进行发起请求时候一般都是GET请求,要发生post请求可以在html文件中特意说明。
而此时在路由文件中:
urlpatterns = [
path('my/',views.MyView.as_view()),#只有加了as_view()后才会生效.
path('login_view/',views.LoginView.as_view()),
]
它必须添加view()才能生效,不然会发生报错。
4、自定义 404 页面:
在当访问一些我们没有定义的路由时经常会弹出:
为了美化我们的项目,我们可以自定义404页面。
创建一个叫404的html文件后,在视图文件中:
def custom_404(request,exception):
return render(request,'404.html',status=404)#记得响应状态码也要改
而此时在路由文件中切记不是用path方法,而是在urlpatterns前面添加:
from django.conf.urls import handler404
handler404=views.custom_404
此时若是直接运行会发生报错,原因就是在setting.py文件中:做以下操作便可以
DEBUG = False
ALLOWED_HOSTS = ['*']
然后再次运行,此时若是输入没有自定义的路由后会出现自己编辑的404.html文件的内容。
三、总结:
该文主要写了关于Django中关于视图的一些基本操作,包括:视图的请求、响应HttpResponse、类试图、自定义404界面等。如若发现错误欢迎各位大佬来指正。后续我会继续更新关于Django的其它操作,大家可以点个关注坐等后续。