路飞学城Python-Day79

27-url控制器之path方法
因为基于re_path的路径编写方式是重复性高的编写url,若是规则改变了,则对应的要去修改不少url,这样是很不方便的
因此采用Django2.0的path去编写url
第一个问题,函数 year_archive 中year参数是字符串类型的,所以须要先转化为整数类型的变量值,固然year=int(year) 不会有诸如如TypeError或者ValueError的异常。那么有没有一种方法,在url中,使得这一转化步骤能够由Django自动完成?
第二个问题,三个路由中article_id都是一样的正则表达式,可是你须要写三遍,当以后article_id规则改变后,须要同时修改三处代码,那么有没有一种方法,只需修改一处便可?
在Django2.0中,可使用 path 解决以上的两个问题
基本规则:
* 使用尖括号(<>)从url中捕获值。
* 捕获值中能够包含一个转化器类型(converter type),好比使用 <int:name> 捕获一个整数变量。若果没有转化器,将匹配任何字符串,固然也包括了 / 字符。
* 无需添加前导斜杠。

Django默认支持如下5个转化器:
* str,匹配除了路径分隔符(/)以外的非空字符串,这是默认的形式
* int,匹配正整数,包含0。
* slug,匹配字母、数字以及横杠、下划线组成的字符串。
* uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
* path,匹配任何非空字符串,包含了路径分隔符
 
28-path的自定义转换器
对于一些复杂或者复用的须要,能够定义本身的转化器。转化器是一个类或接口,它的要求有三点:
* regex 类属性,字符串类型
* to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
* to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,一般用于url反向引用。
 
29-url控制总结
1.path的简单配置
2.有名分组,按照name的参数固定传关键字参数
3.命名空间,namespace使用去给相同的变量定义名称空间
4.反向解析就是不用硬编码的形式,起别名的方式拿到最新的url形式

30-视图层之请求对象
视图,是一个简单的Python 函数,它接受Web请求而且返回Web响应。响应能够是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西均可以。不管视图自己包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此以外没有更多的要求了——能够说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中
request大部分都是请求上的数据封装好的字典
url包含的内容
1.协议 Https
2.IP地址
3.端口号
4.请求数据
/*
 
1.HttpRequest.GET
 
  一个相似于字典的对象,包含 HTTP GET 的全部参数。详情请参考 QueryDict 对象。
 
2.HttpRequest.POST
 
  一个相似于字典的对象,若是请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
 
  POST 请求能够带有空的 POST 字典 —— 若是经过 HTTP POST 方法发送一个表单,可是表单中没有任何的数据,QueryDict 对象依然会被建立。
   所以,不该该使用 if request.POST  来检查使用的是不是POST 方法;应该使用 if request.method == "POST"
  另外:若是使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
   
   注意:键值对的值是多个的时候,好比checkbox类型的input标签,select标签,须要用:
        request.POST.getlist("hobby")
 
3.HttpRequest.body
 
  一个字符串,表明请求报文的主体。在处理非 HTTP 形式的报文时很是有用,例如:二进制图片、XML,Json等。
  可是,若是要处理表单数据的时候,推荐仍是使用 HttpRequest.POST 。
 
 
4.HttpRequest.path
 
  一个字符串,表示请求的路径组件(不含域名)。
  例如:"/music/bands/the_beatles/"
 
5.HttpRequest.method
 
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET"、"POST"
 
 
6.HttpRequest.encoding
 
  一个字符串,表示提交的数据的编码方式(若是为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
   这个属性是可写的,你能够修改它来修改访问表单数据使用的编码。
   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
   若是你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
 
 
7.HttpRequest.META
 
  一个标准的Python 字典,包含全部的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
 
    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE —— 请求的正文的MIME 类型。
    HTTP_ACCEPT —— 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
    HTTP_HOST —— 客服端发送的HTTP Host 头部。
    HTTP_REFERER —— Referring 页面。
    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR —— 客户端的IP 地址。
    REMOTE_HOST —— 客户端的主机名。
    REMOTE_USER —— 服务器认证后的用户。
    REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
    SERVER_NAME —— 服务器的主机名。
    SERVER_PORT —— 服务器的端口(是一个字符串)。
  从上面能够看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 以外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将全部字母大写并将链接符替换为下划线最后加上 HTTP_  前缀。
    因此,一个叫作 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
 
8.HttpRequest.FILES
 
  一个相似于字典的对象,包含全部的上传文件信息。
   FILES 中的每一个键为<input type="file" name="" /> 中的name,值则为对应的数据。
  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的状况下才会
   包含数据。不然,FILES 将为一个空的相似于字典的对象。
 
 
9.HttpRequest.COOKIES
 
  一个标准的Python 字典,包含全部的cookie。键和值都为字符串。
 
 
 
10.HttpRequest.session
 
  一个既可读又可写的相似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
    完整的细节参见会话的文档。
 
 
11.HttpRequest.user(用户认证组件下使用)
 
  一个 AUTH_USER_MODEL 类型的对象,表示当前登陆的用户。
 
  若是用户当前没有登陆,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你能够经过 is_authenticated() 区分它们。
 
    例如:
 
    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.
 
 
       user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
 
     -------------------------------------------------------------------------------------
 
    匿名用户
    class models.AnonymousUser
 
    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具备下面几个不一样点:
 
    id 永远为None。
    username 永远为空字符串。
    get_username() 永远返回空字符串。
    is_staff 和 is_superuser 永远为False。
    is_active 永远为 False。
    groups 和 user_permissions 永远为空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引起 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
 
*/
request的经常使用方法
/*
 
1.HttpRequest.get_full_path()
 
  返回 path,若是能够将加上查询字符串。
 
  例如:"/music/bands/the_beatles/?print=true"
 
 
2.HttpRequest.is_ajax()
 
  若是请求是经过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是不是字符串'XMLHttpRequest'。
 
  大部分现代的 JavaScript 库都会发送这个头部。若是你编写本身的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 能够工做。
 
  若是一个响应须要根据请求是不是经过AJAX 发起的,而且你正在使用某种形式的缓存例如Django 的 cache middleware,
   你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应可以正确地缓存。
 
*/
31-视图响应对象
视图函数本质上就是返回的HttpResponse,不论是render仍是别的函数,返回的都是HttpResponse
相应对象一共有3种类型
1.HttpResponse()
2.render()
3.redirect()
HttpResponse()括号内直接跟一个具体的字符串做为响应体,比较直接很简单,因此这里主要介绍后面两种形式
render()
render(request, template_name[, context])
 
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它。
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面做为响应体。
redirect()
def my_view(request):
    ...
    return redirect('/some/url/')
def my_view(request):
    ...
    return redirect(' http://example.com/') 
1)301和302的区别。
 
  301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取
(用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)——这是它们的共同点。
 
  他们的不一样在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;
 
  302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301
 
 
2)重定向缘由:
(1)网站调整(如改变网页目录结构);
(2)网页被移到一个新地址;
(3)网页扩展名改变(如应用须要把.php改为.Html或.shtml)。
这种状况下,若是不作重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户获得一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的
网站,也须要经过重定向让访问这些域名的用户自动跳转到主站点等。
从数据库提取的值如何放进HTML的页面里?
有模板文件的时候,是render方法,找到文件之后,检查模板语法,找到语法时,对语法内的变量进行替换,替换以后再返回给html的浏览器作解析
32-模板语法之变量
Django做为模板语言的传参的时候,会把模板语言内的如{{text}},中的text转译之后传给浏览器(Django是为了数据的安全性),浏览器拿到的只能是转译以后的字符串,因此解析不了标签语言了,
from django.shortcuts import render,HttpResponse
 
# Create your views here.
 
 
def index(request):
    """
    模板语法:
    {{ }}-->>渲染变量
    1.深度查询 句点符
    2.过滤器
    {% %}-->>渲染标签
    :param request:
    :return:
    """
    name = 'pandaboy'
    i = 10
    l = [1, 2, 3, 'list']
    info = {'name': 'yuan', 'age': 20}
    return render(request, 'index.html', {'name': name, 'i': i, 'l': l, 'info': info})
    # return render(request, 'index.html', loacls())

33-过滤器
过滤器的做用把视图传入的变量不直接显示,加之内容或形式上的修饰后再进行传参
语法
{{obj|filter__name:param}}
default
若是一个变量是false或者为空,使用给定的默认值。不然,使用变量的值。例如
{{ value|default:"nothing" }}
length
返回值的长度。它对字符串和列表都起做用。例如:
{{ value|length }}
若是 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ value|filesizeformat }}
若是 value 是 123456789,输出将会是 117.7 MB。
date
若是 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }} 
slice
若是 value="hello world"
{{ value|slice:"2:-1" }}
truncatechars
若是字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:要截断的字符数
例如:
{{ value|truncatechars:9 }}
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,缘由显而易见,这样是为了安全。可是有的时候咱们可能不但愿这些HTML元素被转义,好比咱们作一个内容管理系统,后台添加的文章中是通过修饰的,这些修饰多是经过一个相似于FCKeditor编辑加注了HTML修饰符的文本,若是自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,若是是一个单独的变量咱们能够经过过滤器“|safe”的方式告诉Django这段代码是安全的没必要转义。好比:
value="<a href="">点击</a>"
{{ value|safe}}
34-模板语法之标签
for标签
遍历每一个元素
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
能够利用{% for obj in list reversed %}反向完成循环。
遍历一个字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循环序号能够经过{{forloop}}显示  
for...empty...
for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,能够有所操做。
{% for person in person_list %}
<p>{{ person.name }}</p>
 
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if标签
{% if %}会对一个变量求值,若是它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if user != None%}
<p>登陆成功</p>
{% else %}
<p>请登陆</p>
{% endif %}
with别名标签
使用一个简单地名字缓存一个复杂的变量,当你须要使用一个“昂贵的”方法(好比访问数据库)不少次的时候是很是有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token安全验证标签
csrf是由Django的服务端为客户端生成的一个"身份证",客户端经过csrf_token的验证以后就能完成各类请求服务端数据的操做
相关文章
相关标签/搜索