django思路图大致整理
2017-07-10 09:23:16 1 举报
AI智能生成
Django的一些常用知识整理的思维导图,大致内容
作者其他创作
大纲/内容
路由层
通过设置url文件下的url来匹配路由,过于简单不多做赘述
模板层
继承母版
写好母版后可以通过子板可以通过{% extends 'base.html' %}导入母版的内容
母版中需要替换的内容区域可以写上<br> {% block xx %}{% endblock %},子板再通过写入对应的代码块,在其中写入子板个性化页面
定义小工具
在一个页面写好小工具后可以通过{% include 'pub.html' %}导入,类似一个写好的独立的样式可以重复使用
数据提交
form表达提交
示例:<pre><span><</span><span>form </span><span>action=</span><span>"/login/" </span><span>method=</span><span>"POST"</span><span>></span><br> {% <span>csrf_token </span>%}<br> <span><</span><span>div</span><span>></span><span>用户名:</span><span><</span><span>input </span><span>type=</span><span>"text" </span><span>class=</span><span>"user_name" </span><span>name=</span><span>"user_name"</span><span>></</span><span>div</span><span>></span><br> <span><</span><span>div</span><span>></span><span>密 </span><span>&nbsp;&nbsp;</span><span>码: </span><span><</span><span>input </span><span>type=</span><span>"password" </span><span>class=</span><span>"pwd" </span><span>name=</span><span>"pwd"</span><span>></</span><span>div</span><span>></span><br> <span><</span><span>input </span><span>type=</span><span>"submit" </span><span>class=</span><span>"login" </span><span>value=</span><span>"</span><span>登录账户</span><span>" </span><span>onclick=</span><span>"</span>login()<span>"</span><span>></span><br> <span><</span><span>div </span><span>style=</span><span>"</span><span>color</span>: <span>red</span><span>" </span><span>class=</span><span>"help"</span><span>></span>{{ <span>help </span>}}<span></</span><span>div</span><span>></span><br><span></</span><span>form</span><span>></span></pre>
ajax提交
需要jq插件:<pre><span>$</span>.<span>ajax</span>(<br> {<br> <span>type</span>:<span>'POST'</span>,<br> <span>url</span>:<span>'/classs/'</span>,<br> <span>data</span>:{<span>'class_name'</span>:<span>$</span>(<span>'.class_name'</span>).<span>val</span>()},<br> <span>success</span>:<span>function </span>(arg)<br> {<br> <span>if </span>(arg==<span>'ok'</span>){<br> <span>location</span>.<span>reload</span>()<br> }<span>else </span>{<br> <span>alert</span>(<span>'</span><span>添加失败</span><span>'</span>)<br> }<br> }<br> }<br>)</pre>
子主题
模型层
修改setting里的数据库配置文件
在models文件中创建数据类
在setting中注册app
制作数据迁移,python manage.py makemigrations
数据迁移到数据库,python manage.py migrate
视图层
在views文件中写入对应url的函数在返回渲染后的网页字符串
直接打印字符到网页,<pre><span>return HttpResponse('...')</span></pre>
返回并渲染页面 return render(request,‘test.html’{传入前端的字典元素})
页面跳转 return <span>redirect(‘url’)</span>
其他层
CSRF跨站请求伪造防护
form表单中添加<br> {% csrf_token %}
局部禁用
导入from django.views.decorators.csrf import csrf_exempt
指定函数加上装饰器@csrf_exempt
局部使用
导入from django.views.decorators.csrf import csrf_exempt,csrf_protect
指定函数加上@csrf_protect
ajax提交数据
<div><form method="POST" action="/csrf1.html"><br> {% csrf_token %}<br> <input id="user" type="text" name="user" /><br> <input type="submit" value="提交"/><br> <a onclick="submitForm();">Ajax提交</a><br> </form><br> <script src="/static/jquery-1.12.4.js"></script><br> <script><br> function submitForm(){<br> var csrf = $('input[name="csrfmiddlewaretoken"]').val();<br> var user = $('#user').val();<br> $.ajax({<br> url: '/csrf1.html',<br> type: 'POST',<br> data: { "user":user,'csrfmiddlewaretoken': csrf},<br> success:function(arg){<br> console.log(arg);<br> }<br> })<br> }</div><div> </script>通过查看源码用jq找到标签取值后提交</div>
<div>放在请求头中<br> <br> <form method="POST" action="/csrf1.html"><br> {% csrf_token %}<br> <input id="user" type="text" name="user" /><br> <input type="submit" value="提交"/><br> <a onclick="submitForm();">Ajax提交</a><br> </form><br> <script src="/static/jquery-1.12.4.js"></script><br> <script src="/static/jquery.cookie.js"></script></div><div> <script><br> function submitForm(){<br> var token = $.cookie('csrftoken');<br> var user = $('#user').val();<br> $.ajax({<br> url: '/csrf1.html',<br> type: 'POST',<br> headers:{'X-CSRFToken': token},<br> data: { "user":user},<br> success:function(arg){<br> console.log(arg);<br> }<br> })<br> }<br> </script></div>
cookie
保存在客户端浏览器上的键值对
使用方法:<pre>obj=redirect(<span>'/classs/'</span>)<br>obj.set_signed_cookie(<span>'name'</span>,<span>'cris'</span>,<span>salt</span>=<span>'666'</span>,<span>max_age</span>=<span>10000</span>)</pre>
取值:<pre>cok=request.get_signed_cookie(<span>'name'</span>,<span>salt</span>=<span>'666'</span>)</pre>
session
保存在服务端的数据(本质是键值对),作用:保持会话(Web网站)
使用方法request.session[key]=value
取值:request.session.get(key)
设置超时时间:request.SESSION_COOKIE_AGE = 604800
删除数据库中过期的session数据<br> -manage.py cleanup
session的配置文件,可将其放入settings:<br> # SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串<br> # SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径<br> # SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名<br> # SESSION_COOKIE_SECURE = False # 是否Https传输cookie<br> # SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输<br> # SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)<br> # SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期<br> # SESSION_SAVE_EVERY_REQUEST = False
删除session<br> request.session.delete(request.session.session_key)清除数据库中的过期session<br> request.session.clear()删除浏览器cookie
中间件
中间件类似于一个过滤器,在执行请求或者返回参数的时候会执行相应的函数
所有中间件在setting配置文件中的函数,以及注册地点:<pre>MIDDLEWARE = [<br> <span>'django.middleware.security.SecurityMiddleware'</span>,<br> <span>'django.contrib.sessions.middleware.SessionMiddleware'</span>,<br> <span>'django.middleware.common.CommonMiddleware'</span>,<br> <span>'django.middleware.csrf.CsrfViewMiddleware'</span>,<br> <span>'django.contrib.auth.middleware.AuthenticationMiddleware'</span>,<br> <span>'django.contrib.messages.middleware.MessageMiddleware'</span>,<br> <span>'django.middleware.clickjacking.XFrameOptionsMiddleware'</span>,<br> <span>'m.M1'</span>,<br> <span>'m.M2'</span>,<br>]</pre>
中间件的过滤请求函数:<pre><span>def </span>process_request(<span>self</span>,<span>ruquest</span>):<br> <span>print</span>(<span>'M1.process_request'</span>) 如果在请求函数中直接返回的话就会从当前类中的返回函数中返回</pre>
中间件的过滤返回函数:<pre><span>def </span>process_response(<span>self</span>,<span>response</span>):<br> <span>print</span>(<span>'M1.process_response'</span>)<br> <span>return </span><span>response#注意response必须要有返回函数</span></pre>
中间件的过滤视图函数,一共有四个值self,view函数,*args,**kwargs<pre><span>def </span>process_view(<span>self</span>,request,view_fuc,args,kwargs):<br> <span>print</span>(<span>'M1.process_view'</span>)<br> <span>response</span>=view_fuc(request,*args,**kwargs)<br> <span>return </span><span>response</span></pre>
Form表单
通过Form表单来过滤input的输入数据
class RegisterFprm(Form):<br> username = fields.CharField(max_length=16,<br> min_length=6,<br> required=True,<br> error_messages={'max_length': '用户名格式不正确',<br> 'min_length': '用户名格式不正确',<br> 'required': '用户名不能为空'})<br> pwd = fields.CharField(max_length=32,<br> min_length=10,<br> required=True,<br> error_messages={'max_length': '密码格式不正确',<br> 'min_length': '密码格式不正确',<br> 'required': '密码不能为空',})<br> pwda= fields.CharField(max_length=32,<br> min_length=10,<br> required=True,<br> error_messages={'max_length': '密码不正确',<br> 'min_length': '密码不正确',<br> 'required': '密码不能为空',})
通过Form表单来生成HTML标签
创建好Form对象,将Form对象(无参数)通过模板语言的方式传入前端
如何设置form表单的样式?可以通过设置插件的方式来设置标签的样式
设置多选框样式
<pre><span>widget=widgets.CheckboxSelectMultiple</span></pre>
单选按钮样式
<pre><span>widget=widgets.RadioSelect</span></pre>
文件选择样式
<pre><span>widget=widgets.FileInput</span></pre>
设置下拉框以及设置class
<pre>cls_id = fields.<pre><span>ModelMultipleChoiceField</span></pre>(<br> <span># widget=widgets.Select(choices=[(1,'</span><span>上海</span><span>'),(2,'</span><span>北京</span><span>')])<br></span><span> </span><span>widget</span>=widgets.Select(<span>choices</span>=models.Classes.objects.values_list(<span>'id'</span>,<span>'title'</span>),<span>attrs</span>={<span>'class'</span>: <span>'form-control'</span>})<br>)</pre>
Ajax的原理
原生Ajax
1原生Ajax:XMLHttpRequest<br> GET方式:<br> function add1()<br> {<br> var xhr=new XMLHttpRequest();<br> xhr.onreadystatechange=function () {<br> if(xhr.readyState==4){<br> alert(xhr.responseText)<br> }<br> };<br> xhr.open('GET','/add1/?id=123&id1=123');<br> xhr.send();<br> }<br> POST方式:<br> function add1()<br> {<br> var xhr=new XMLHttpRequest();<br> xhr.onreadystatechange=function () {<br> if(xhr.readyState==4){<br> alert(xhr.responseText)<br> }<br> };<br> xhr.open('POST','/add1/');<br> xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');<br> xhr.send('i1=12&i2=19');<br> }<br> <br> <br> }
JqAjax
jquery Ajax:内部基于原生ajax<br> $.ajax({<br> url:<br> data:<br> type:<br> success:<br> })
伪Ajax
伪ajax,非XMLHttpRequest,(通过iframe标签的特殊属性,实现不用刷新就可以实现数据提交)<br> <form id="f1" action="/add2/" method="post" target="ifr"><br> <iframe id="ifr" name="ifr"></iframe><br> <input type="text" name="user"/><br> <button onclick="submit()">提交</button><br> </form><br> <script><br> function submit() {<br> document.getElementById('ifr').onload=load;<br> document.getElementById('f1').submit();<br> }<br> function load() {<br> var content=document.getElementById('ifr').contentWindow.document.body.innerTxet<br> alert(content)<br> }<br> </script>
文件上传(本次模拟一个图片上传,上传后再在页面上进行预览)
伪ajax<br> <form id="f1" action="/add2/" method="POST" target="ifr" enctype="multipart/form-data"><br> <iframe id="ifr" name="ifr" style="display: none"></iframe><br> <input id="i1" type="file" name="fff"/><br> <a onclick="submit()">提交</a><br> </form><br> <div id="img"></div><br> <script src="/static/jquery-3.2.1.js"><br> </script><br> <script><br> function submit()<br> {<br> document.getElementById('ifr').onload = load;<br> document.getElementById('f1').submit();<br> }<br> function load() {<br> var doc=document.getElementById('ifr').contentWindow.document.body.innerText;<br> var tag=document.createElement('img');<br> tag.src='/'+doc;<br> document.getElementById('img').appendChild(tag)<br> }<br> </script>
<div>原生ajax文件提交:<br> function upload1(){<br> var formData = new FormData();<br> formData.append('fafafa',document.getElementById('i1').files[0]);<br> var xhr = new XMLHttpRequest();<br> xhr.onreadystatechange = function(){<br> if(xhr.readyState == 4){<br> var file_path = xhr.responseText;<br> var tag = document.createElement('img');<br> tag.src = "/"+ file_path;<br> document.getElementById('container1').appendChild(tag);</div><div> }<br> };<br> xhr.open('POST','/upload/');<br> xhr.send(formData);<br> }</div>
jquery ajax文件提交:<br> function upload2(){<br> var formData = new FormData();<br> // formData.append('fafafa',document.getElementById('i1').files[0]);<br> formData.append('fafafa',$('#i2')[0].files[0]);<br> $.ajax({<br> url: '/upload/',<br> type: 'POST',<br> data: formData,<br> contentType:false,<br> processData:false,<br> success:function(arg){<br> var tag = document.createElement('img');<br> tag.src = "/"+ arg;<br> $('#container2').append(tag);<br> }<br> })<br> }
JSONP
JSONP是因为浏览器的同源策略,让浏览器无法实现跨域请求,而存在的,那么如何绕过同源策略呢
<div>自己写:<br> 服务端:<br> def test(request):<br> print('1111')<br> fucname=request.GET.get('call_back')<br> my_list=[<br> 'cris',<br> 'alex',<br> 'lion',<br> 'marry',<br> ]<br> my_data=json.dumps(my_list)<br> value='%s(%s)'%(fucname,my_list)<br> return HttpResponse(value)<br> <br> 客户端:<br> <div><br> <input type="button" onclick="add1()" value="请求"><br> </div></div><div> <script><br> function add1() {<br> var tag=document.createElement('script');<br> tag.src='http://127.0.0.1:8000/test/?call_back=call_back';<br> document.head.appendChild(tag)<br> }<br> function call_back(arg) {<br> console.log(arg)<br> }<br> </script></div>
jquery方式:<br> $.ajax({<br> url:'http:/127.0.0.1:8000/test',<br> type:'GET',<br> dataType:'JSONP',<br> jsonp:'funcname',<br> jsonpCallback:'fuc'<br> })<br> function fuc(arg){<br> console:log(arg)<br> }
<div>CORS方式:<br> 只要服务器方加一个返回头,浏览器就会允许数据通过<br> 简单请求<br> def new_users(request):<br> obj = HttpResponse('asdfasdf')<br> obj['Access-Control-Allow-Origin'] = "*"<br> return obj<br> <br> 复杂请求:<br> def new_users(request):<br> print(request.method)<br> if request.method == "OPTIONS":<br> obj = HttpResponse()<br> obj['Access-Control-Allow-Origin'] = "*"<br> obj['Access-Control-Allow-Methods'] = "DELETE"<br> return obj</div><div> obj = HttpResponse('asdfasdf')<br> obj['Access-Control-Allow-Origin'] = "*"<br> return obj</div>
收藏
收藏
0 条评论
下一页