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>,如果还有参数直接添加就好了。