Django篇(三)
- 2019 年 10 月 6 日
- 筆記
1、视图的功能
接受请求,和模板页(T)、models进行交互,并返回应答。
可以返回一个内容HttpResponse,也可以重定向redirect。
2、视图的使用
2.1必须有一个request参数,来接收服务器返回给我们的内容,
比如在登陆的时候的账号密码发送过来,我们就是用request这个参数来接收。
2.2必须要配置url,才能映射到我们的方法。
3、简述url的匹配过程:
比如浏览器中输入127.0.0.1:8000/aindex,
浏览去发送到项目的urls.py文件中进行匹配,如果我项目的url匹配是这样的:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^a', include('student.urls')),
]
那么我们Django框架从浏览器中拿到aindex来和url中匹配,很明显第一个和我们的url并不匹配,
第二个匹配,于是就映射到student这个应用下的urls.py文件中,假如我们student.py下的url.py匹配规则是这样:
urlpatterns = [
url(r'^index$', views.index),
]
从项目中匹配的a会过滤掉,就只剩下index发送到我们应用(student)下的urls.py中,刚好匹配,就会映射到我们视图
中的index方法。
注意:如果访问的地址是这样:127.0.0.1:8000/aindex?id=1.
其中的?id=1是不参与匹配的,他代表的是参数,在视图中我也可以通过request对象获取到。
4、当我们浏览器访问一个不存在的页面会报错404,当我们模板有错误的时候会报错500,
并且都会提示哪里有错误,这在项目上线后是不允许的,怎么让他只显示404或者500,不会提示具体的错误信息?
需要在setting.py中,将DEBUG=True修改为DEBUG=False,将ALLOWED_HOSTS=[]修改成ALLOWED_HOSTS=[*]表示允许所有人访问。
当然在开发的时候还是True好点。
4.1当做了上面一系列修改后,错误页面就只会显示Not Found,这种简单的信息。
如果你认为这个404页面不好看,或者500页面不好看,我们只需要在模板(Templates)下创建404.html
或者500.html,当找不到页面的时候,就会自动访问404.html,无需其他配置。
5、捕获url参数
在上一篇实例中,我们就使用过,上一篇文章中应用下的url.py是这样的:
urlpatterns = [
url(r'^classinfo$', views.show_classname),
url(r'^classinfo/(d+)$', views.show_stuinfo),
]
其中带有正则中带有括号的,就是我们用来捕捉url参数的,你想要什么内容,就用()将它括起来。
我们在视图中,需要在该对应的视图方法上再添加一个参数,这个参数接收的就是我们正则中括起来的部分。
6、cookie和session
由于HTTP协议是无状态的,他不会记住你上一次做了什么操作。
所以我们需要cookie和session来帮助我们需要记住的东西,(比如账号密码)
那么为什么需要两个来保存呢?
cookie是储存在本地,也就是你磁盘的文本,是不安全的,session是储存在服务端的,所以需要这两个相辅相成。
cookie的请求过程:
浏览器输入网址,发送给服务器请求,服务器进行处理,设置cookie信息,返回给浏览器set-cookie这个字段,浏览器保存到本地,
下次再次请求这个域名相关的网站,浏览器会将cookie一起发送给服务器,服务器如果接收到cookie,从中取出账号等,就不用我们再次登陆了。
cooike是由过期时间的,如果不设置,就会在关闭浏览器的时候失效。
session:
依赖于cookie。请求的过程差不多,session是放在cookie张保存的。
cookie常用于记住用户名。
session常用于记住登陆状态,等要求安全系数高的数据。
模板
1、模板的作用
展示我们的html页面。
2、模板的查找顺序
首先会在我们自己创建的templates下查找模板文件,如果没有,会在配置文件setting.py的INSTALLED_APPS中查找,
必须要有templates这个文件夹,他才会去查找,所有只会再去查找前两个应用时候有该文件。所以404.html不用我们配置,他就会找到。
3、变量使用
3.1、模板使用返回的数据
{{数据}}
3.2、for循环
{% for i in 可遍历对象%}
数据 xxx
显示遍历的次数,从1开始
{{forloop.counter}}
数据为空
{ empty}
为空时输出
{% endfor%}
if判断
{% if 条件%}
{%elif 条件%}
{%else%}
{%endif%}
其中的比较运算符,运算符左右需要空格隔开。
4、过滤器
常用操作:
date:改变日期的显示格式
lenth:求长度。
default:设置默认值
使用格式:模板变量|过滤器:参数
比如stuinfo.bir_date是从view返回的生日
我们写成:{{stuinfo.bir_date|date:'Y年-m月-d-日'}}
求长度:没有参数比如 name|lenth
设置默认值:name|defaulf:'zhangsan'
还有很多,遇到再说。
5、模板注释
单行注释:{% 注释内容 %}
多行注释:{% comment %}
内容
{%endcomment%}
html注释:<!– 内容 –>
6、继承模板页
很多时候,我们页面大多数的菜单,头部,底部都是一样的,我们不可能每次都写一遍,所以就需要继承模板页。
{% extends '父页面路径'%},同时我们也要在父模板中预留位置来存放子页面:
{%block 块名%}
{%endblock 块名%}
块名,为自定义名字。子模版也写上同样的:
{%block 块名%}
{%endblock 块名%}
7、登录装饰器
我们基本大部分页面都是需要登陆才可以访问,此时我们就需要写一个登陆的装饰器来帮助我们。
写一个装饰器函数:
def login_required(func):
def wrapper(request,*view_args,**view_kwargs):
# 判断是否存在session,不存在表示没登录
if request.session.has_key('你的session名字')
return func(request,*view_args,**view_keargs)
else:
# 重定向
return redirect('登陆页的视图函数')
return wrapper
8、url反向解析
如果每个页面都有返回主页,但是我们的主页方法改了,那么每个返回主页的链接都要修改,很麻烦。
可以将我们的url写成动态的。
在写成动态之前需要:
将项目下的url.py,添加一个namespace参数:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^a', include('student.urls',namespace='student')),
]
我在include中添加了一个namespace参数,一般给应用名,再修改应用下的urls.py添加一个name属性:
urlpatterns = [
url(r'^classinfo$', views.show_classname,name = 'classinfo'),
url(r'^classinfo/(d+)$', views.show_stuinfo),
]
此时:我们页面返回classinfo的页面可以写成:
<a href="{% student:classinfo %}">classinfo</a>
就会自动的去访问classinfo页。如果在url中捕捉的有参数:需要写成
<a href="{% url 'student:classinfo' 参数1 %}">classinfo</a>,如果还有参数直接添加就好了。