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