目录
零之前言
这一节里,内容较多,可能涉及了我还没有说过的内容,Model模型和templates模板,但是我会尽可能的少使用和阐述清楚。
这一节的内容对应千峰教育视频的P33~P39,视频会有更详细的表述:
https://www.bilibili.com/video/av57516522?p=33
Views是我们需要操作的核心,绝大部分操作的代码都写在views里。views可以帮我们处理我们获得的请求,并对这个请求作出反应。
一.返回一段文字
假设我们不使用网页,而只返回一段小段文字的话,我们可以直接使用,当然这段文字可以带H5标识的文字:
例如:
def hello(request):
return HttpResponse('Hello')
def bey(request):
return HttpResponse("<a href=""www.baidu.com"">我去百度</a>")
二.返回一个没有传入参数的网页
网页,就是我们的Templates。我们将我们的"伪代码网页"放在我们的templates目录里面,就可以返回这个网页(网页是通过django渲染我们的伪代码网页成真的网页传给用户看)
在我们的template里面写入新建一个HTML file,然后进入修改我们的html内容:
然后新建路由和视图:
re_path(r"login/", views.login, name="login"),#记住这个在urls里
def login(request):#记住这个在view里
return render(request, '233.html')
小提示:
当我们代码底部出现小波浪号的时候,可以使用Alt+Enter万能键来达成快捷操作,比如此时,我们没有创建login这个函数,那么可以通过这个方法来直接创建我们的函数。
我们使用render来渲染我们的模板,因为我们开始设置了模板文件夹,所以我们模板直接写相对路径就可以了。
return render(request, '233.html')
效果:
三.返回一个带有传入参数的网页
我们新建路由,视图:
re_path(r"welcome/", views.welcome, name="welcome"),
def welcome(request):
text = "铁憨憨"
a = "铜憨憨"
b = '银憨憨'
c = '金憨憨'
print(locals())
return render(request, 'welcome.html', locals())
说明:第三个参数的类型是字典,你需要传入一个字典。而locals()是一个函数,将局部变量打包成一个字典
eg:运行访问welcome后得到:
并且创建我们的模板:
解释:{{参数名字}},相当于通过这样的标识标记这个text是view里的变量,我们渲染的时候不会渲染显示 欢迎你:{{text}} 。而是: 欢迎你:text的变量内容
效果:
四.返回一个带有Python命令的网页
这因该是模板的内容,放这里说一下,对后面有用,先看看就行了
此python命令,只是一个命令,可以将一些循环判断语句写入到模板里,然后通过这些命令,渲染出我们的要求的网页。
写出我们的url和view:
re_path(r"select/", views.select, name="select"),
def select(request):
text = "铁憨憨"
a = range(5)
return render(request, 'select.html', locals())
写出我们的模板:
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>欢迎你:{{ text }}</h1>
<br>
<h1>你是:</h1>
{% for i in a %}
<h3>{{ i }}:憨憨</h3>
<br>
{% endfor %}
{% if text == "铁憨憨" %}
<h1>我真的是铁憨憨</h1>
{% else %}
<h1>我不是铁憨憨</h1>
{% endif %}
</body>
</html>
{% 这里面写部分python语句%},后面说模板的时候会讲该部分内容。通过修改我们view里函数里text和a的值,可以修改我们的网页内容
五.提交/接收一个get/post表单
我们需要用一个url来显示编辑表单的页面,还需要一个url来传递这个表单。
新建一个模板:getpost.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div style ="text-align: center;">
<form action="{% url 'app:do_get' %}" method ="get">
<span>设备ID:</span> <input type="text" name ="id" value = {{ ids }}>
<button>确定</button>
</form>
</div>
<br>
<div style ="text-align: center;">
<form action="{% url 'app:register_post' %}" method ="post">
<span>用户名:</span> <input type="text" name ="name" placeholder="please input your id">
<br>
<span>密码:</span> <input type = "password" name ="password">
<br>
<button>注册</button>
</form>
</div>
</body>
</html>
其中,我们的{%url 'app:do_get'%就相当于反向解析出我们的url是app里的do_get.
然后我们写出路由:
re_path(r"test/", views.test, name="test"),
re_path(r"do_post/", views.post, name="do_post"),
re_path(r"do_get/", views.get, name="do_get"),
写出我们的视图:
def post(request):
if request.method == "GET":
return HttpResponse('wrong')
else:
print(request.POST)
return HttpResponse(request.POST.get('text'))
def get(request):
return HttpResponse(request.GET.get('id'))
def test(request):
return render(request, 'getpost.html')
我们来看一看结果:
第一个表单:
第二个表单:
控制台:
说明:get/post会通过字典的形式将参数传入到我们的路由中,我们可以通过request.GET或者request.POST来获取我们的传入的字典,然后再用get()获取对应参数的值。
而我们的request.method可以返回我们路由获得的表单的方式。所以通过添加request.method可以将我们的get/post写入同一个路由。
有什么用处?我们可以通过get/post的路由,写一个cookies或者sessions,亦或者将数据存入我们的数据库。
六.提交/获取Cookies
1.常规cookie
写上我们的路由与视图:
re_path(r"set_cookies/", views.sc, name="set_cookies"),
re_path(r"get_cookies/", views.gc, name="get_cookies"),
from django.urls import reverse #这个命令django无法自动补充,需要自己添加
def sc(request):
res = HttpResponseRedirect(reverse("app:get_cookies"))
res.set_cookie('username', 1)
res.set_cookie('userkey', 2)
return res
def gc(request):
return HttpResponse(request.COOKIES.get("username"))
我们看看效果:
set/get cookies的代码一眼就能看懂,关键是这个res = HttpResponseRedirect(reverse("app:get_cookies"))
HttpResponseRedirect是将这个响应重定向到一个URL。但是参数里面跟的是硬编码,比如/app/get_cookies。 所以我们需要用reverse()函数将我们的命名反向解析为硬编码。
常见的响应重定义有:HttpResponseDirect, redirect。他们的区别就在于第一个只能用于URL,第二个可以用于模板和URL,但我一般用于模板。具体区别参照大佬文章:https://blog.csdn.net/weixin_42134789/article/details/81505963
2.加盐(加密)cookies
我们把命令换成set_signed_cookie就行了
def sc(request):
res = HttpResponseRedirect(reverse("app:get_cookies"))
res.set_signed_cookie('username',1,'miyao')
res.set_cookie('userkey', 2,)
return res
def gc(request):
return HttpResponse(request.get_signed_cookie('username',salt = 'miyao'))
效果:
七.提交Session
session我不想再赘述了,原理和cookies差不多,只不过cookie是存放在客户端的,而session是放在你服务器里的一张表里的,你需要手动设置过期时间。具体可以看视频教程,或者网上百度其用法。
八.小结
本篇内容代码我已托管到码云:
https://gitee.com/kannamiao/django_noob
这一篇内容讲了views的用法。现在相当于我们知道了MTV模型的大概雏形:
用户请求→urls→views→template、response→用户
来源:CSDN
作者:康娜喵
链接:https://blog.csdn.net/u011017694/article/details/104107515