40.django中重要概念

模板引擎

1.基本数据类型

  • 字符串、整数、小数
  • 列表
  • 字典
  • 列表套字典

2.母版

  • 母版页面(layout.html)

    {% block mycontent%}
    {% endblock %}
    
    {% block mycss%}
    {% endblock %}
    
    {% block myjs%}
    {% endblock %}
  • 子版页面
    {%extends "layout.html"%} 继承母版
    
    {% block mycontent%}
     子版自己的内容
    {% endblock %}

3.导入模块方式

使用include:{% includde " xxx.html" %} 可以导入对应模板中的内容

4.内置函数

str='cc FF gg AA'

html模板中:
{{ str|upper }}     CC FF GG AA
{{ str|lower }}       cc ff gg aa
{{ str|first|upper }}   c
{{ str|truncatewords:"3" }}  cc FF gg...

5.自定义函数

a. 在app中创建templatetags目录
b. 在上述的目录中创建 xxx.py
c. 在xxx.py中,
from django import template

register = template.Library()

@register.filter
def my_filter(val, args):
    return val + args

@register.simple_tag
def my_upper(val, args, args1):
    return val + args + args1

在html中:
{%load xxx %}

- simple_filter
{{name | my_filter:'xxxxx'}}

- simple_tag
{%my_upper "zekai" "sss" 'dsadsadsa'%}

不建议在模板中使用函数, 因为会降低模板的渲染效率, 建议在视图函数中直接处理, 然后渲染即可

cookie,session

cookie是存在于客户端的,
   它的作用是:
       验证登录信息的,通过使用 cookie完善登录的逻辑

   为了便于理解可以把cookie当作记录了登录信息的小纸条,并且有一定的生效时间。
   cookie具体在网络中的机制是:
   1.首先浏览器客户端登录访问服务端时,服务端提供登录页面给浏览器
   2.浏览器端提交数据给服务器,相当于记录信息(是session的机制)
   3.此时服务端会回写cookie给浏览器,也就是相当于递了一个小纸条给浏览器
   4.浏览器将cookie保存,并发送第二次请求,而且要带上cookie
   5.服务端通过认证,可以请求其他数据。

   在python中具体的用法是:
 通过set_cookie这个函数,后面跟的参数有,key-value,
  是cookie的键值对,用来设定值,通过判断来确定是否需要登录,
  后面有一个参数是max_age,表示登录后生效的时间,超过此时间,           cookie会被清除,则需要再次登录。

  还有expires也是表示生效时间,以年月日形式,最少设为一天
  domain是表示生效的域名

  如果一个cookie被设置了Secure=true,那么这个cookie只能用https协议发送给服务器,用http协议是不发送的 

  我们可以通过document.cookie打出cookie的内容
  只要通过设置HttpOnly=true,这样cookie就不能被js获取到    

  为了安全性:我们还可以加盐处理set_signed_cookie(key, val,  salt)
session在服务端,依赖于cookie的,用来登记信息

session机制:
1. 向客户端回写一个 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'}的cookie值
2. 将客户的隐私信息保存在了服务端的数据库中,也就是session保存在了数据库中
默认放在django_session表中
{"dsjnalndjskanjdksa" : {"name":'xxx', 'age':18, 'addr':'dsabdsa'}}

#### 在视图函数中设置session的方法:
request.session['name'] = username
request.session['age'] = 13

#### 获取session
request.session.get('name')

### 默认session存在数据库中的django_session表

#还可以通过缓存,文件或者缓存加数据库的方式保存session

中间件

在django中,浏览器和服务端之间发送请求和响应时需要通过中间件,在django的settings中,有一个 MIDDLEWARE_列表中,每一个元素就是一个中间件。

当django处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的。我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以后直接返回 Response。

中间件定义方法

中间件中可以定义五个方法,具体如下:

Request预处理函数: process_request(self, request)

这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的视图函数。Django向它传入相应的Request对象,以便在方法中修改。

如果返回None,Django将继续处理这个request,执行后续的中间件, 然后调用相应的 view。

如果返回HttpResponse对象,Django将不再执行任何除了process_response以外其它的中间件以及相应的view,Django将立即返回该HttpResponse。

View预处理函数: process_view(self, request, callback, callback_args,callback_kwargs)

这个方法的调用时机在 Django 执行完 request 预处理函数并确定待执行的 view (即callback参数)之后,但在 view 函数实际执行之前。

request:HttpRequest 对象。

callback:Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。

args:将传入view的位置参数列表,但不包括request参数(它通常是传入view的第一个参数)。

kwargs:将传入view的关键字参数字典。

process_view() 应当返回None或 HttpResponse 对象。如果返回 None, Django将继续处理这个request ,执行后续的中间件, 然后调用相应的view。

如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(不论种类)以及相应的view,Django将立即返回。

Template模版渲染函数:process_template_response()

默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值(对象)中rende方法的结果)

Exception后处理函数:process_exception(self, request, exception)

这个方法只有在 request 处理过程中出了问题并且view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。

这个函数的参数除了一贯的request对象之外,还包括view函数抛出的实际的异常对象exception 。

process_exception() 应当返回None或HttpResponse对象。

如果返回None,Django将用框架内置的异常处理机制继续处理相应request。

如果返回HttpResponse对象,Django将使用该response对象,而短路框架内置的异常处理机制。

Response后处理函数:process_response(self, request, response)

这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。

该处理器能修改response 的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。

这个方法的参数相当直观:request是request对象,而response则是从view中返回的response对象。

process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

中间件执行流程

请求到达中间件之后,先按照正序执行每个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法(注意不是掉头执行所有的process_response方法),将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。

process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。

MVC,MTV

MVC模式:程序不论简单或复杂,从结构上看,都可以分成三层

1.最上面的一层,是直接面向最终用户的”视图层”(View)。它是提供给用户的操作界面,是程序的外壳。
2.最底下的一层,是核心的”数据层”(Model),也就是程序需要操作的数据或信息
3.中间的一层,就是”控制层”(Controller),它负责根据用户从”视图层”输入的指令,选取”数据层”中的数据,然后对其进行相应的操作,产生最终结果

MTV模式:django中特有的模式

1.M: model, 相当于model层,和mvc中的m一样

2.T: Template, 相当于view层

3.V: view, 相当于controller层

Csrf攻击

CSRF(Cross-site request forgery)跨站请求伪造攻击,与XSS不同,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

防御这种攻击可以在请求地址中添加 token 并验证

原文地址:https://www.cnblogs.com/yellowcloud/p/11365938.html

时间: 2024-08-08 06:40:53

40.django中重要概念的相关文章

转:django中session的实现机制

转:www.jianshu.com 要理解session,首先要搞清楚cookie的概念.由于http是无状态的,服务器不能记住用户的信息状态,因此若由同一个客户端发起的多条请求,服务器不能辨别这些请求来自哪个用户.http无状态的限制为web应用程序的设计带来了许多不便,购物网站中的"购物车"功能就是一个很好的例子,当用户把商品放进购物车后,客户端必须要保存购物车的状态,否则当用户下次浏览网站时,购物车拥有的商品状态便不复存在.客户端和服务器必须有通信的媒介,方便服务器追踪客户端的状

Django中的app及mysql数据库篇(ORM操作)

Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都新建一个文件夹来存放项目文件,切换到这个目录下,启动命令行工具.创建一个名为mysite的Django项目: django-admin startproject mysite 创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹,mysite的文件夹目录结构如下: mysite/ ma

Django中ORM字段以及字段参数介绍

一:Django中ORM的介绍 1.ORM的概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. 2.ORM的来源 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系"(Relational)

Django中的Model(操作表)

一.基本操作 1 # 增 2 3 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs 4 5 obj = models.Tb1(c1='xx', c2='oo') 6 obj.save() 7 dic = {'c1':'xx','c2':'oo'} models.Tb1.objects.create(**dic) #Form的产出结果是一个字典,可以根据这个Form的字典和**直接在数据库创建数据 8 #

Django中的数据库查询

web应用需要经常向数据库查询相关的数据,Django语言也不例外.了解Django中的数据查询操作,对于优化应用的性能,有着重要的意义. 基础信息 Django中,model通过Manager获取QuerySet,每个model至少有objects这个 Manager . QuerySet 可以有一个或多个 filter , filter 根据传入的参数返回 QuerySet 结果. 用SQL来对比, QuerySet 相当于 SELECT , filter 相当于 WHERE 或者是 LIM

Django中的CSRF

CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御.然而,对于大多数人来说,CSRF 却依然是一个陌生的概念.即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 C

[Django高级]理解django中的中间件机制和执行顺序

原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middleware 和中间件在下面文章中含义相同,不完全翻译了 假设你已经阅读了 Django官方文档middleware部分. 下面会尽可能详尽的介绍文档中提到的知识,但是还是希望你熟悉 middleware 基本的概念. 这篇文章中我们将讨论下面内容: 什么是 middleware 什么时候使用 middle

django中如何生成非HTML格式的内容。

某些时候可能有这样的需求,在网页中点击一个链接或者一个按钮希望返回一张图片.一个pdf文档.一个csv文档等而非HTML.在diango中很容易做到这些.django中的view用来接收http request并返回web response.通常情况下,返回的内容为HTML,但其能够返回的不仅仅如此,还可以是上述图片.pdf文件等等.返回非HTML形式的内容的关键在于HttpResponse这个类,尤其是mimetype这个参数,通过将此参数设置为不同的值可以提示浏览器view返回了不同格式的内

Django中模型(二)

Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据属性的类型确定以下信息 ·当前选择的数据库支持字段的类型 ·渲染管理表单时使用的默认html控件 ·在管理站点最低限度的验证 B. ·django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列 C.属性命名限制 ·遵循标识