Django
2017-07-10 12:17:11 16 举报
AI智能生成
Django知识点整理:视图、orm
作者其他创作
大纲/内容
ORM
创建表
基本结构
class(models.Model)
字段
参数
元信息
连表操作
一对一
一对多
多对多
操作表
增
删
改
查
路由系统
单一路由对应
<pre>url(r<span>'</span><span>^index$</span><span>'</span>, views.index),</pre>
基于正则的路由
<pre>url(r<span>'</span><span>^index/(\d*)</span><span>'</span><span>, views.index),</span></pre>
<pre>url(r<span>'</span><span>^manage/(?P<name>\w*)/(?P<id>\d*)</span><span>'</span>, views.manage),</pre>
添加额外的参数
<pre>url(r<span>'</span><span>^manage/(?P<name>\w*)</span><span>'</span>, views.manage,{<span>'</span><span>id</span><span>'</span>:<span>333</span>}),</pre>
为路由映射设置名称
<pre><span>url(r</span><span>'</span><span>^index/(\d*)</span><span>'</span>, views.index, name=<span>'</span><span>h2</span><span>'</span>),</pre>
根据APP对路由规则进行分类
<pre>url(r<span>'</span><span>^web/</span><span>'</span>,include(<span>'</span><span>web.urls</span><span>'</span>)),</pre>
命名空间
<span>project.urls.py</span>
<span>app01.urls.py</span>
<span>app01.views.py</span>
其他
XSS和CSRF
XSS(跨栈脚本攻击)
预防方式
无法控制输入内容不使用safe
<pre>{ <div>{{ item|safe }}</div> <span>}</span></pre>
在views文件中过滤特殊字符,如alter
使用mark_safe标记
<pre>temp =<span> mark_safe(temp)</span></pre>
CSRF(<span>跨站请求伪造</span>)
防止方式
全局
<span>中间件 django.middleware.csrf.CsrfViewMiddleware</span><br>
局部
<span style="font-size: 13px;">@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。</span><br>
<span style="font-size: 13px;">@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。</span><br>
应用方式
<span>form表单中添加{% csrf_token %}</span>
<span>全站禁用</span><span># 'django.middleware.csrf.CsrfViewMiddleware',</span>
局部禁用<span>@csrf_exempt</span>
局部使用<span>@csrf_protect</span>
特殊CBV<span>@method_decorator(csrf_protect,name=</span><span>'</span><span>dispatch</span><span>'</span><span>)</span>
<span style="font-size: 13px;">Ajax提交数据时候,携带CSRF</span><br>
放在请求头中<br>
<pre><ol><li><span style="font-size: 1em;">function submitForm(){</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">var</span><span style="font-size: 1em;"> token = $.cookie(</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">csrftoken</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">);</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">var</span><span style="font-size: 1em;"> user = $(</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">#user</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">).val();</span><br></li><li><span style="font-size: 1em;"> $.ajax({</span><br></li><li><span style="font-size: 1em;"> url: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">/csrf1.html</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;"> type: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">POST</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;"> headers:{</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">X-CSRFToken</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: token},</span><br></li><li><span style="font-size: 1em;"> data: { </span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">user</span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">:user},</span><br></li><li><span style="font-size: 1em;"> success:function(arg){</span><br></li><li><span style="font-size: 1em;"> console.log(arg);</span><br></li><li><span style="font-size: 1em;"> }</span><br></li><li><span style="font-size: 1em;"> })</span><br></li><li><span style="font-size: 1em;"> }</span><br></li></ol></pre>
<span>放置在data中携带</span><br>
<pre><ol><li><span style="font-size: 1em;">function submitForm(){</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">var</span><span style="font-size: 1em;"> csrf = $(</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">input[name="csrfmiddlewaretoken"]</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">).val();</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">var</span><span style="font-size: 1em;"> user = $(</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">#user</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">).val();</span><br></li><li><span style="font-size: 1em;"> $.ajax({</span><br></li><li><span style="font-size: 1em;"> url: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">/csrf1.html</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;"> type: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">POST</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;"> data: { </span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">user</span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">:user,</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">csrfmiddlewaretoken</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: csrf},</span><br></li><li><span style="font-size: 1em;"> success:function(arg){</span><br></li><li><span style="font-size: 1em;"> console.log(arg);</span><br></li><li><span style="font-size: 1em;"> }</span><br></li><li><span style="font-size: 1em;"> })</span><br></li><li><span style="font-size: 1em;"> }</span><br></li></ol></pre><div><span><br></span></div>
cookie和session
cookie
<span>保存在客户端浏览器上的键值对</span>
获取cookie
<pre>request.COOKIES[<span>'</span><span>key</span><span>'</span><span>]</span></pre>
<pre>request.get_signed_cookie(key, <span>default</span>=RAISE_ERROR, salt=<span>''</span>, max_age=<span>None)</span></pre>
设置cookie
<pre><span>rep.set_cookie(key,value,...)</span></pre>
<pre>rep.set_signed_cookie(key,value,salt=<span>'</span><span>加密盐</span><span>'</span><span>,...)</span></pre>
操作cookie
<pre><ol><li><span style="font-size: 1em;"><script src=</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">/static/js/jquery.cookie.js</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">></script></span><br></li><li><span style="font-size: 1em;">$.cookie(</span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">list_pager_num</span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">, </span><span style="font-size: 1em;">30</span><span style="font-size: 1em;">,{ path: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">/</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;"> });</span><br></li></ol></pre>
session
保存在服务器端的数据
<span>数据库Session</span>
<pre>request.session[<span>'</span><span>k1</span><span>'</span><span>]</span></pre>
<pre><pre>request.session.<span>get</span>(<span>'</span><span>k1</span><span>'</span><span>,None)</span></pre></pre>
<pre><span>request.session.keys()</span></pre>
<pre>request.session.exists(<span>"</span><span>session_key</span><span>"</span><span>)</span></pre>
<pre>request.session.delete(<span>"</span><span>session_key</span><span>"</span><span>)</span></pre>
<span>缓存session</span>
<span>文件session</span>
<span>缓存+数据库Session</span>
<span>加密cookie Session</span>
<span>Session用户验证</span>
<div><ol><li>def login(func):<br></li><li> def wrap(request, *args, **kwargs):<br></li><li> # 如果未登陆,跳转到指定页面<br></li><li> if request.path == '/test/':<br></li><li> return redirect('http://www.baidu.com')<br></li><li> return func(request, *args, **kwargs)<br></li><li> return wrap<br></li></ol></div>
中间件
<ul><li>process_request(self,request)</li><li>process_view(self, request, callback, callback_args, callback_kwargs)</li><li>process_template_response(self,request,response)</li><li>process_exception(self, request, exception)</li><li>process_response(self, request, response)</li></ul>
分页
Form
应用
是否校验成功
obj.is_valid()
所有错误信息(值为字典)
obj.errors
正确信息
obj.cleaned_data
部分细节
单选框(obj = FooForm({'cls_id':1}))
<div><ol><li>cls_id = fields.IntegerField(<br></li><li> # widget=widgets.Select(choices=[(1,'上海'),(2,'北京')])<br></li><li> widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'),attrs={'class': 'form-control'})<br></li><li>)<br></li></ol></div>
<div><ol><li>cls_id = fields.ChoiceField(<br></li><li> choices=models.Classes.objects.values_list('id','title'),<br></li><li> widget=widgets.Select(attrs={'class': 'form-control'})<br></li><li>)<br></li></ol></div>
多选框(obj = FooForm({'cls_id':[1,2,3]}))
<div><ol><li>xx = fields.MultipleChoiceField(<br></li><li> choices=models.Classes.objects.values_list('id','title'),<br></li><li> widget=widgets.SelectMultiple<br></li><li>)<br></li></ol></div>
定义类
<pre><ol><li>class <span style="font-size: 1em;">LoginForm(Form):</span><br></li><li> username=fields.CharField(<br></li><li> <span style="font-size: 1em;">max_length</span><span style="font-size: 1em;">=</span><span style="font-size: 1em;">18</span><span style="font-size: 1em;">,</span><br></li><li> <span style="font-size: 1em;">min_length</span><span style="font-size: 1em;">=</span><span style="font-size: 1em;">6</span><span style="font-size: 1em;">,</span><br></li><li> <span style="font-size: 1em;">required</span><span style="font-size: 1em;">=</span><span style="font-size: 1em;">True</span><span style="font-size: 1em;">,</span><br></li><li> <span style="font-size: 1em;">error_messages</span><span style="font-size: 1em;">={</span><br></li><li> <span style="font-size: 1em;">'required'</span><span style="font-size: 1em;">:</span><span style="font-size: 1em;">'用户名不能为空'</span><span style="font-size: 1em;">,</span><br></li><li> <span style="font-size: 1em;">'min_length'</span><span style="font-size: 1em;">:</span><span style="font-size: 1em;">'用户名长度不能小于6'</span><span style="font-size: 1em;">,</span><br></li><li> <span style="font-size: 1em;">'max_length'</span><span style="font-size: 1em;">:</span><span style="font-size: 1em;">'用户名长度不能大于18'</span><span style="font-size: 1em;">,</span><br></li><li> }<br></li><li> )<br></li></ol></pre>
JSONP
同源策略:限制Ajax,不限制:script
同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。
使用方法
自己写动态创建script
<div><ol><li>function getUsers(){<br></li><li> var tag = document.createElement('script');<br></li><li> tag.src = "http://www.s4.com:8001/users/?funcname=bbb?sdd";<br></li><li> document.head.appendChild(tag);<br></li><li>}<br></li></ol></div>
jQuery
<div><ol><li>jQuery<br></li><li> $.ajax({<br></li><li> url: 'http://www.s4.com:8001/users/',<br></li><li> type: 'GET',<br></li><li> dataType: 'JSONP',<br></li><li> jsonp: 'funcname',<br></li><li> jsonpCallback: 'bbb'<br></li><li>})<br></li></ol></div>
CORS
跨域资源共享
模板
模板语言
变量
<pre><ol><li>{{ item }}<br></li></ol></pre>
if判断
<pre><pre><span style="font-size: 1em;"><ol><li> <span style="font-size: 1em;">{% </span><span style="font-size: 1em;">if</span><span style="font-size: 1em;"> condition %</span><span style="font-size: 1em;">}</span><br></li><li> <span style="font-size: 1em;"> ... display</span><br></li><li> <span style="font-size: 1em;">{% endif %</span><span style="font-size: 1em;">}</span><br></li></ol></span></pre></pre>
for循环
<pre><ol><li><span style="font-size: 1em;">{% </span><span style="font-size: 1em;">for</span><span style="font-size: 1em;"> item </span><span style="font-size: 1em;">in</span><span style="font-size: 1em;"> item_list %</span><span style="font-size: 1em;">}</span><br></li><li><span style="font-size: 1em;"> <a>{{ item }}</a> </span><br></li><li><span style="font-size: 1em;">{% endfor %}</span><br></li></ol></pre>
<span style="font-size: 13px;">母板、子板</span><br><div></div>
母版
<ol><li>{% block title %<span style="font-size: 1em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace;">}</span><br></li><li> {% endblock %<span style="font-size: 1em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace;">}</span><br></li></ol>
子板
<pre><span style="font-size: 1em;"><ol><li><span style="font-size: 1em;">{% extends </span><span style="font-size: 1em;">"</span><span style="font-size: 1em;">base.html</span><span style="font-size: 1em;">"</span><span style="font-size: 1em;"> %</span><span style="font-size: 1em;">}</span></li><li><span style="font-size: 1em;"> {% block title %</span><span style="font-size: 1em;">}</span><br></li><li><span style="font-size: 1em;"> {% endblock %} </span><br></li></ol></span></pre>
ifequal(如果两值相等,显示标签中间值)
<pre><span style="font-size: 1em;"><ol><li><span style="font-size: 1em;">{% ifequal user currentuser %</span><span style="font-size: 1em;">}</span><br></li><li><span style="font-size: 1em;"> <h1>Welcome!</h1></span><br></li><li><span style="font-size: 1em;">{% endifequal %}</span><br></li></ol></span></pre>
<ul><li>include标签</li></ul>
<pre><span>{</span>% include <span>"</span><span>nav.html</span><span>"</span> %}</pre>
前端定义函数
filter(最多支持2个参数)
<pre><ol><li><span style="font-size: 1em;">@register.filter</span><br></li><li><span style="font-size: 1em;">def my_func1(value1, value2):</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">return</span><span style="font-size: 1em;"> value1 +</span><span style="font-size: 1em;"> value2</span><br></li></ol></pre>
<pre>{{ <span>"</span><span>alex</span><span>"</span>|my_func1:<span>"</span><span>-egon</span><span>"</span><span> }}</span></pre>
simple_tag(支持三个以上参数)
<pre><ol><li><span style="font-size: 1em;">@register.simple_tag</span><br></li><li><span style="font-size: 1em;">def my_simple_time(v1,v2,v3):</span><br></li><li><span style="font-size: 1em;"> </span><span style="font-size: 1em;">return</span><span style="font-size: 1em;"> v1 + v2 +</span><span style="font-size: 1em;"> v3</span><br></li></ol></pre>
<pre>{{ <span>"</span><span>alex</span><span>"</span>|my_func1:<span>"</span><span>-egon</span><span>"</span><span> }}</span></pre>
视图
CBV
FBV
基本配置
基本指令
同步数据库
<pre><ol><li><span style="font-size: 1em;">python manage.py makemigrations</span><br></li><li><span style="font-size: 1em;">python manage.py migrate</span><br></li></ol></pre>
创建app
<pre><span>python manage.py startapp appname</span></pre>
清空数据库
<pre><span>python manage.py flush</span></pre>
创建Django程序
<span style="font-size: 13px;">终端命令:django-admin startproject sitename</span><br>
程序目录
主文件名
static
templates
manage.py
配置文件
数据库
<pre>DATABASES</pre>
<pre><ol><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">default</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: {</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">ENGINE</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">django.db.backends.mysql</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">NAME</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">:</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">s4day71db</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">USER</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">root</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">PASSWORD</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: </span><span style="font-size: 1em;">''</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">HOST</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: </span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">localhost</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">,</span><br></li><li><span style="font-size: 1em;">'</span><span style="font-size: 1em;">PORT</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">: </span><span style="font-size: 1em;">3306</span><span style="font-size: 1em;">,</span><br></li></ol></pre>
模板
<pre><ol><li><span style="font-size: 1em;">TEMPLATE_DIRS =</span><span style="font-size: 1em;"> (</span><br></li><li><span style="font-size: 1em;"> os.path.join(BASE_DIR,</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">templates</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">),</span><br></li><li><span style="font-size: 1em;"> )</span><br></li></ol></pre>
静态文件
<pre><ol><li><span style="font-size: 1em;">STATICFILES_DIRS =</span><span style="font-size: 1em;"> (</span><br></li><li><span style="font-size: 1em;"> os.path.join(BASE_DIR,</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">static</span><span style="font-size: 1em;">'</span><span style="font-size: 1em;">),</span><br></li><li><span style="font-size: 1em;"> )</span><br></li></ol></pre>
setting中添加当前app
请求生命周期
wsgi封装→Django框架→中间件→路由系统→视图处理→中间件→wsgi(本质字符串传递)
session
session是保存在服务端的数据,cookie是保存在浏览器上的键值对,当用户登录时,服务端会生成随机字符串给客户端的浏览器写在cookie中,服务器将随机字符串保存起来,该随机字符串对应一个值,对应一个用户
0 条评论
下一页
为你推荐
查看更多