https://www.cnblogs.com/pandaboy1123/p/9894981.htmljavascript
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。php
浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。html
url:统一资源定位符 ,是互联网上标准资源的地址。前端
HTTP定义了与服务器交互的8种 请求方式java
列举Http请求中常见的请求方式
根据HTTP标准,HTTP请求可使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
----------------------------------------------------------------
get 和 post区别python
区别:nginx
get请求无消息体,只能携带少许数据git
post请求有消息体,能够携带大量数据web
携带数据的方式:ajax
get请求将数据放在url地址中
post请求将数据放在消息体中
GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

http协议是基于网络应用层的,对服务器和客户端(浏览器)之间的一种传输超文本的传送协议
长链接:HTTP的相应头内有Connection:keep-alive 在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。
Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接要客户端和服务端都支持长链接。 HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接
http协议特色
一、基于TCP/IP
二、基于请求-响应模式-->请求从客户端发出,最后服务器端响应该请求并 返回
三、无状态保存---不对请求和响应之间的通讯状态进行保存
四、无链接---每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。
MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式链接在一块儿
模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图以下所示:
MTV
Django的MTV模式本质上和MVC是同样的,也是为了各组件间保持松耦合关系,只是定义上有些许不一样,Django的MTV分别是值:
model 英 /'mɒdl/ 美 /'mɑdl/
通常是用户经过浏览器向咱们的服务器发起一个请求(request),这个请求会去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),
视图函数调用模型,模型去数据库查找数据,而后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django的请求生命周期是指当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情
通常是用户经过浏览器向咱们的服务器发起一个请求(request),这个请求会去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),
视图函数调用模型,模型去数据库查找数据,而后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
#1.wsgi,请求封装后交给web框架 (Flask、Django) #2.中间件,对请求进行校验或在请求对象中添加其余相关数据,例如:csrf、request.session - #3.路由匹配 根据浏览器发送的不一样url去匹配不一样的视图函数 #4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 - #5.中间件,对响应的数据进行处理。 #6.wsgi,将响应的内容发送给浏览器。
五、简述什么事FBV和CBV
FBV(function base views) 就是在视图里使用函数处理请求 CBV(class base views) 就是在视图里使用类处理请求
Python是一个面向对象的编程语言,若是只用函数来开发,有不少面向对象的优势就错失了(继承、封装、多态)。
因此Django在后来加入了Class-Based-View。可让咱们用类写View。这样作的优势主要下面两种: 提升了代码的复用性,可使用面向对象的技术,好比Mixin(多继承) 能够用不一样的函数针对不一样的HTTP方法处理,而不是经过不少if判断,提升代码可读性
object relation map
首先在视图模块中添加如下导入 from rest_framework import permissions
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,而且在全局上改变django的输入与输出。
由于改变的是全局,因此须要谨慎实用,用很差会影响到性能。
实例: 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where=['price>50']) Book.objects.filter(publisher__name='广东人员出版社',price__gt=50) 2:Book.objects.extra(select={'count':'select count(*) from hello_Book'}) 使用raw: Book.objects.raw('select * from hello_Book') 自定义sql: Book.objects.raw("insert into hello_author(name) values('测试')") rawQuerySet为惰性查询,只有在使用时生会真正执行 执行自定义sql: from django.db import connection cursor=connection.cursor() #插入操做 cursor.execute("insert into hello_author(name) values('郭敬明')") #更新操做 cursor.execute('update hello_author set name='abc' where name='bcd'') #删除操做 cursor.execute('delete from hello_author where name='abc'') #查询操做 cursor.execute('select * from hello_author') raw=cursor.fetchone() #返回结果行游标直读向前,读取一条 cursor.fetchall() #读取全部
首先,定义一个实例使用的django数据库模型Product,只是象征性地定义了两个字段name和price
批量建立数据使用for循环,建立数据的时候尽可能最后执行建立语句,使用django的语法 bulk_create product_list_to_insert = list() for x in range(10): product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert)
---
Django ORM 中的批量操做 在Hibenate中,经过批量提交SQL操做,部分地实现了数据库的批量操做。但在Django的ORM中的批量操做却要完美得多,真是一个惊喜。 数据模型定义 首先,定义一个实例使用的django数据库模型Product,只是象征性地定义了两个字段name和price。 from django.db import models class Product(models.Model): name = models.CharField(max_length=200) price = models.DecimalField(max_digits=10, decimal_places=2) 批量插入数据 批量插入数据时,只需先生成个一要传入的Product数据的列表,而后调用bulk_create方法一次性将列表中的数据插入数据库。 product_list_to_insert = list() for x in range(10): product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert) 批量更新数据 批量更新数据时,先进行数据过滤,而后再调用update方法进行一次性地更新。下面的语句将生成相似update...where...的SQL语句。 Product.objects.filter(name__contains='name').update(name='new name') 批量删除数据 批量更新数据时,先是进行数据过滤,而后再调用delete方法进行一次性地删除。下面的语句将生成相似delete from...where...的SQL语句。 Product.objects.filter(name__contains='name query').delete() 若是是经过运行普通Python脚本的方式而不是在view中调用上述的代码的,别忘了先在脚本中进行django的初始化: import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testproject.settings") import django django.setup() Hibernate的所谓“批量操做”中,对每个实体的更新操做,都会生成一条update语句,而后只是把好几个update语句一次性提交给数据库服务器而已。对实体的删除操做也是同样。 Django ORM中的批量操做的实现更接近于SQL操做的体验,运行效率也会比Hibernate中的实现更加高效。
域名解析成IP地址;
与目的主机进行TCP链接(三次握手);
发送与收取数据(浏览器与目的主机开始HTTP访问过程);
与目的主机断开TCP链接(四次挥手);
migrate 英 /maɪ'greɪt; 'maɪgreɪt/ 美 /'maɪɡret/ 移动
在pycharm的Terminal执行
数据迁移的指令
python manage.py makemigrations
python manage.py migrate
----------------------------------
1.request.method == 'GET' 2.request.method == 'POST'
1六、经常使用视图响应的方式是什么?
1.Httpreponse 2.render 3.redirect
1七、HTTP响应的常见状态码分类?
状态码如200 OK,以3位数字和缘由 成。数字中的 一位指定了响应 别,后两位无分 。响应 别有以5种。
常见的HTTP状态码: 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误
路由选择的最长匹配原则----当路由器收到一个IP数据包时,会将数据包的目的IP地址与本身本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则
要使用缓存系统须要先在settings.py中设置,Django提供多种缓存类型:Memcached缓存,数据库缓存,文件系统缓存,局部内存缓存和自定义缓存等
1、jsonp跨域 JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法, JSON、JSONP的区别: 1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用) 2、JSONP 只支持get请求、不支持post请求
2、nginx反向代理:

三、WebSocket协议跨域
域名简称网域
是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。
跨域:
好比从www.baidu.com 页面去请求 www.google.com 的资源。
跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不一样,就被看成是跨域
----------------------------------------------------------------------------------
跨域,指的是浏览器不能执行其余网站的脚本。它是由浏览器的同源策略形成的,是浏览器施加的安全限制。
所谓同源是指,域名,协议,端口均相同
什么是跨域? 跨域,指的是浏览器不能执行其余网站的脚本。它是由浏览器的同源策略形成的,是浏览器施加的安全限制。 所谓同源是指,域名,协议,端口均相同,不明白不要紧,举个栗子: http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域) http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不一样:123/456,跨域) http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不一样:abc/def,跨域) http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不一样:8080/8081,跨域) http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不一样:http/https,跨域) 请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。 浏览器执行javascript脚本时,会检查这个脚本属于哪一个页面,若是不是同源页面,就不会被执行。 解决办法: 1、JSONP: 使用方式就不赘述了,可是要注意JSONP只支持GET请求,不支持POST请求。 2、代理: 例如www.123.com/index.html须要调用www.456.com/server.php,能够写一个接口www.123.com/server.php,由这个接口在后端去调用www.456.com/server.php并拿到返回值,而后再返回给index.html,这就是一个代理的模式。至关于绕过了浏览器端,天然就不存在跨域问题。 3、PHP端修改header(XHR2方式) 在php接口脚本中加入如下两句便可: header('Access-Control-Allow-Origin:*');//容许全部来源访问 header('Access-Control-Allow-Method:POST,GET');//容许访问的方式 --------------------- 做者:L瑜 来源:CSDN 原文:https://blog.csdn.net/lambert310/article/details/51683775 版权声明:本文为博主原创文章,转载请附上博文连接!
Django中内置的signal 英 /'sɪgn(ə)l/ 美 /'sɪgnl/
Django中提供了"信号调度",用于在框架执行操做时解耦.
一些动做发生的时候,系统会根据信号定义的函数执行相应的操做
https://www.cnblogs.com/renpingsheng/p/7566647.html
三种继承方式: 1、抽象基类(Abstract base classes) 二、多表继承(Multi-table inheritance) 三、代理
在进行相对复杂的查询时,使用 django.db.models.Q 对象。
例如须要进行复合条件的查询的SQL语句以下:
与或非操做
is_valid()
方法,用于检查表单提交是否正确。
级联就是咱们说的连表的操做,连表将会使表之间经过各类关系链接起来,可是orm删除的时候是指定字段的,因此须要在model的表中经过外键链接设置级联关系删除 user = models.FroeignKey(User, blank=True, null=True, on_delete=models.SET_NULL) 须要注意的是on_delete=models.SET_NULL的前提必须是null=true
models.SET_NULL这里还有其余几个选项: * SET_NULL 当外键的字段被删除的时候设置为null前提是指定了 null=True * CASCADE 默认的选项,当外键关联的字段删除的时候,全部其余表级联删除 * SET_DEFAULT 设置一个默认值,当关联的记录删除的时候恢复成默认值 *DO_NOTHING django不作任何事情,数据库返回什么就报什么 * SET()¶ 还能够set一个函数,当关联记录删除的时候触发获得一个值
cookies和session都属于一种会话跟踪技术
Session是服务器端技术,利用这个技术,服务器在运行时能够 为每个用户的浏览器建立一个其独享的session对象,因为 session为用户浏览器独享,
因此用户在访问服务器的web资源时 ,能够把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
其实Cookie是key-value结构,相似于一个python中的字典
cookie的概念
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie是key-value结构,相似于一个python中的字典。
随着服务器端的响应发送给客户端浏览器。而后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器建立
,而后经过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪一个服务器的Cookie)。当客户端向服务器发出请求时会把全部
这个服务器Cookie包含在请求中发送给服务器,这样服务器就能够识别客户端了!
当咱们在django中用到session时,cookie由服务器端随机生成,写到浏览器的cookie中,每一个浏览器都有本身cookie值,是session寻找用户信息的惟一标识
session的好处:客户端只有cookies的值,但始终没有用户的信息。
用法:request.session.get('k1')
request.session['k1']='v1'
session依赖于cookies,cookie保存在浏览器,session保存在服务器端
会从新登陆(若是A服务器的session数据不和B服务器的数据共享的话)
跨域请求能够用jsonp来解决只能用于get,也能够用这个插件:django-cors-headers
1.安装django-cors-headers
2.配置settings.py文件
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
两大特征是:惰性执行和 缓存
django建立 查询 集不会访问数据库,直到调用数据时才访问数据库
当调用以下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回全部数据。 filter():返回知足条件的数据。 exclude():返回知足条件以外的数据。 order_by():对结果进行排序。 一:惰性执行 books = BookInfo.objects.all() # 此时,数据库并不会进行实际查询 # 只有当真正使用时,如遍历的时候,才会真正去数据库进行查询 for b in books: print(b) 二:缓存 使用同一个查询集,第一次使用时会发生数据库的查询,而后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减小了数据库的查询次数 新建一个查询集对象就能够实现
all():返回全部数据。
filter():返回知足条件的数据。
exclude():返回知足条件以外的数据。
order_by():对结果进行排序。
urlpatterns = [ path('admin/', admin.site.urls),]
--
from django.conf.urls import url,include from arya.service.sites import site from django.urls.resolvers import RegexURLPattern from django.urls.resolvers import RegexURLResolver from django.shortcuts import HttpResponse def index(request): print(get_all_url(urlpatterns,prev='/')) return HttpResponse('...') def get_all_url(urlparrentens,prev,is_first=False,result=[]): if is_first: result.clear() for item in urlparrentens: v = item._regex.strip('^') #去掉url中的^和') #去掉url中的^和 if isinstance(item,RegexURLPattern): result.append(prev + v) else: get_all_url(item.urlconf_name,prev + v) return result urlpatterns = [ url(r'^arya/', site.urls), url(r'^index/', index), ]
路由分发
url用解耦的做用
include是路由转发功能,由于不一样的app针对的是不一样的分发路由路径,因此经过from django.conf.urls import include,来肯定导入的路由的路径
django2.0中写路由的正则方式须要导入re_path的方式来匹配正则表达式,直接使用会报错,django1.xx中则没有限制
name是给url中取一个别名
namespace名称空间,防止多个应用之间的路由重复
namespace
url: re_path(r'^app01/', include("app01.urls",namespace="app01")), app01.urls: urlpatterns = [ re_path(r'^index/', index,name="index"), ] app01.views: from django.core.urlresolvers import reverse def index(request): return HttpResponse(reverse("app01:index"))
使用HttpResponseRedirect redirect和reverse 状态码:302,301
在models里面作primary_key的设置
null 是针对数据库而言,若是 null=True, 表示数据库的该字段能够为空。
blank 是针对表单的,若是 blank=True,表示你的表单填写该字段的时候能够不填,好比 admin 界面下增长 model 一条记录的时候。直观的看到就是该字段不是粗体
django中提供choice类型
gender_choice=(('1','男'),('2','女 '))
user_gender=Models.CharFied(max_length=2,choices=gender_choice)
在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询。 1,select_related适用于外键和多对一的关系查询; 2,prefetch_related适用于一对多或者多对多的查询。
django中须要设置on_delete来设置级联关系表
# 当前生成的书籍对象 book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1) # 为书籍绑定的作做者对象 yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录 egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录 # 绑定多对多关系,即向关系表book_authors中添加纪录 book_obj.authors.add(yuan,egon) # 将某些特定的 model 对象添加到被关联对象集合中。 ======= book_obj.authors.add(*[]) +------------------------------------------------------------------------------------------------------------------------+ book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 ====== book_obj.authors.remove(*[]) book_obj.authors.clear() #清空被关联对象集合 book_obj.authors.set() #先清空再设置
tags = models.ManyToManyField( to="Tag", through='Article2Tag', through_fields=('article', 'tag'), )
* HTTPresponse, * jsonresponse, * redirect
from django.contrib.auth.decorators import login_required
@login_required---用于验证是否有登陆状态,若是没有登陆,设置跳转的页面就会跳转至未登陆状态的页面 @permission_required---检查用户是否具备特定权限是一项相对常见的任务 @get_permission_required---返回mixin使用的可迭代权限名称。默认为permission_required属性,必要时转换为元组。 @has_permission---返回一个布尔值,表示当前用户是否有权执行装饰视图
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake' } }
本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端
@get和@post使用 1:在views模板下编写测试函数(记得在urls.py文件中进行相应配置) 2:将刚刚封装的函数所在模板引入views.py 3:使用@get进行拦截 @params,response_success,response_failure使用 第一种 @login_required def simple_view(request): return HttpResponse()123 2 经过对基于函数视图或者基于类视图使用一个装饰器实现控制: @login_required(MyView.as_view())1 3 经过覆盖mixin的类视图的dispatch方法实现控制:
自定义过滤器@register.filter
自定义filter:{{ 参数1|filter函数名:参数2 }} # 1.能够与if标签来连用 # 2.自定义时须要写两个形参 # simple_tag:{% simple_tag函数名 参数1 参数2 %} # 1.能够传多个参数,没有限制 # 2.不能与if标签来连用 @register.simple_tag def multi_tag(x,y): return x*y

会话跟踪技术,保留用户 Cookie是由服务器建立,而后经过响应发送给客户端?的一个键值对。 具体一个浏览器针对一个服务器存储的key-value({ }) response.set_cookie("is_login",True) request.COOKIES.get("is_login")
https://mp.weixin.qq.com/s?src=11×tamp=1543650968&ver=1277&signature=14H5aRhphiu5QRsUP15kV*RpCgGIp5-BWGot2wg4rZPhMjxQNjluUCvzRO9tXb4KqgSysEFhPX2TBDKaMbyfZuzjG2P-M1BgrozF-Jj-aU33g4mMK51XAj3Xd9KKsDJl&new=1
CSRF跨站点请求伪造(Cross—Site Request Forgery)

XSS利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。
与XSS攻击相比,CSRF攻击每每不大流行(所以对其进行防范的资源也至关稀少)和难以防范,因此被认为比XSS更具危险性。
防护CSRF攻击:
验证HTTP_REFERER字段
请求中添加token验证
在Http头中自定义属性并验证
---
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的恶意代码被执行。
如今业界对CSRF的防护,一致的作法是使用一个Token(Anti CSRF Token)。 例子: 用户访问某个表单页面。 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。 在页面表单附带上Token参数。 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。 这个Token的值必须是随机的,不可预测的。因为Token的存在,攻击者没法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽可能把敏感操做由GET改成POST,以form或AJAX形式提交,避免Token泄露。 --------------------- 做者:徐彬 来源:CSDN 原文:https://blog.csdn.net/qq_33182756/article/details/80461649 版权声明:本文为博主原创文章,转载请附上博文连接!
django中token防护的总体思路 第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token放到cookie中交给前端页面; 第二步:下次前端须要发起请求的时候会携带者这个token,一块儿传给后端;Cookies:{csrftoken:xxxxx} 第三步:1.若是是经过表单发送post请求,后端会验证cookie中的csrftoken值和表单中的csrfmiddlewaretoken是否一致 2.若是是ajax发送的post请求,后端会验证cookie中的csrftoken值和请求头中的X-CSRFtoken中的值是否一致 实现csrf保护 1.form提交时加上 { % csrf_token %} 2.在ajax中提交时:取到csrf的 var csrfToken = $("[name='csrfmiddlewaretoken']").val(); 加到传输的数据中 data: { csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(), },
当用户发起请求的时候会依次通过全部的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。
中间件中一共有四个方法:
process_request
process_view
process_exception
process_response
(1)GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditPost.aspx?name=test1&id=123456.POST方法是把提交的数据放在HTTP包的Body中。 (2)GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制。 (3)GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值。 (4)GET方式提交数据,会带来安全问题,好比一个登陆页面,经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码。
一本书对应多个做者,一个做者对应多本书------>书籍和做者多对多的关系
一个出版社对应多本书------->出版社和书籍--一对多的关系
from django.db import models # Create your models here. class Author(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) age=models.IntegerField() class Publish(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) city=models.CharField(max_length=32) email=models.EmailField() class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2) # 与publish创建一对多的关系,在健在多的一方(Book) # to=表名 to_field=字段 publish=models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) # 与Author创建多对多的关系 能够创建在两个模型中的任意一个,自动建立第三张表 authors=models.ManyToManyField(to='Author')
反向解析
在模板中:
path('login/', views.login,name='log'), <form action='{% url 'log' %}' method='post'>
访问 127.0.0.1:8080/login
若是后续把
path('login.html/', views.login,name='log'),
访问 127.0.0.1:8080/login.html
在试图函数中反向解析:
from django.urls import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) # 同redirect("/path/")
模板 - 自定义标签和过滤器--解决复用问题
在app中建立templatetags模块---在文件夹下创建my_tag.py文件
自定义过滤器---有参数限制 两个

{% load xxx %} # num=12 {{ num|filter_multi:2 }} 结果------#24
自定义标签--没有参数限制
一、标签:
{% tag %}
{% endtag %}
循环序号能够经过{{forloop}}显示
模板继承 (extend)
#WSGI: # web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,而后将请求交给web框架 # 实现wsgi协议的模块: # 1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django) # 2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask) #uwsgi: # 与WSGI同样是一种通讯协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型 #uWSGI: # 是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,
Django 内置的User类提供了用户密码的存储、验证、修改等功能,默认使用pbkdf2_sha256方式来存储和管理用的密码。 django经过setting.py文件中的PASSWORD_HASHERS来设置选择要使用的算法,列表的第一个元素 (即settings.PASSWORD_HASHERS[0])
会用于储存密码, 全部其它元素都是用于验证的哈希值,它们能够用于检查现有的密码。意思是若是你打算使用不一样的算法,你须要修改PASSWORD_HASHERS,来将你最喜欢的算法在列表中放在首位。 一个settings中的Password_hashers看起来是这样的: PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', 'django.contrib.auth.hashers.CryptPasswordHasher', ) 具体的密码生成以及验证明现 from django.contrib.auth.hashers import make_password,check_password pwd='4562154' mpwd=make_password(pwd,None,'pbkdf2_sha256') # 建立django密码,第三个参数为加密算法 pwd_bool=check_password(pwd,mpwd) # 返回的是一个bool类型的值,验证密码正确与否 Django之密码加密 经过django自带的类库,来加密解密很方便,下面来简单介绍下; 导入包: from django.contrib.auth.hashers import make_password, check_password 从名字就能够看出来他们的做用了。 一个是生成密码,一个是核对密码。 例如: make_password("123456") 获得结果: u'pbkdf2_sha25615000MAjic3nDGFoi$qbclz+peplspCbRF6uoPZZ42aJIIkMpGt6lQ+Iq8nfQ=' 另外也能够经过参数来生成密码: >>> make_password("123456", None, 'pbkdf2_sha256') 校验: 校验就是经过check_password(原始值, 生成的密文)来校验密码的。 >>> check_password("123456","pbkdf2_sha25615000MAjic3nDGFoi$qbclz+peplspCbRF6uoPZZ42aJIIkMpGt6lQ+Iq8nfQ=") True
blank 设置为True时,字段能够为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。若是为True,字段容许为空,默认不容许。 null 设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。因此设置IntegerField,DateTimeField型字段能够为空时,须要将blank,null均设为True。 若是为True,空值将会被存储为NULL,默认为False。 若是想设置BooleanField为空时能够选用NullBooleanField型字段。 一句话归纳 null 是针对数据库而言,若是 null=True, 表示数据库的该字段能够为空。NULL represents non-existent data. blank 是针对表单的,若是 blank=True,表示你的表单填写该字段的时候能够不填。好比 admin 界面下增长 model 一条记录的时候。直观的看到就是该字段不是粗体
在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。 QueryDict相似字典的自定义类,用来处理单键对应多值的状况。 在 HttpRequest 对象中,属性 GET 和 POST 获得的都是 django.http.QueryDict 所建立的实例。这是一个 django 自定义的相似字典的类,用来处理同一个键带多个值的状况。 在 python 原始的字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTML 表单中,一般会发生一个键有多个值的状况,例如 <select multiple> (多选框)就是一个很常见状况。 request.POST 和request.GET 的QueryDict 在一个正常的请求/响应循环中是不可变的。若要得到可变的版本,须要使用.copy()方法。 django QuerySet对象转换成字典对象 >manage.py shell >>> from django.contrib.auth.models import User >>> from django.forms.models import model_to_dict >>> u = User.objects.get(id=1) >>> u_dict = model_to_dict(u) >>> type(u) <class 'django.contrib.auth.models.User'> >>> type(u_dict) <type 'dict'> 1.QueryDict.__init__(query_string=None, mutable=False, encoding=None) 这是一个构造函数,其中 query_string 须要一个字符串,例如: >>> QueryDict('a=1&a=2&c=3') <QueryDict: {'a': ['1', '2'], 'c': ['3']}>