基本结构
│ db.sqlite3 ----------sqlie3数据库 │ manage.py │ ├─logres │ │ admin.py 后台,可以用很少量的代码就拥有一个强大的后台。 │ │ apps.py │ │ models.py 与数据库操作相关,存入或读取数据时用到这个 │ │ tests.py │ │ urls.py │ │ views.py │ │ 处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示 │ │ 内容比如登陆后的用户名,用户请求的数据,输出到网页。 │ │ __init__.py │ │ │ ├─migrations │ │ 0001_initial.py │ │ __init__.py │ │ │ │ ├─Mushishi │ │ settings.py Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等 │ │ urls.py urls.py │ │ 网址入口,关联到对应的views.py中的一个函数(或者generic类), │ │ 访问网址就对应一个函数。 │ │ wsgi.py wsgi有多重一种uwsgi和wsgi,你用那种wsgi来运行Django, 一般不用改只有你用到的时候在改 │ │ __init__.py │ │ ├─static └─templates templates中的Html模板, index.html login.html regist.html
基本命令
1.创建django命令 django-admin.py startproject project-name(你工程的名字) 2.创建django的app python manage.py startapp app-name(你app的名字) 或 django-admin.py startapp app-name(你app的名字) 3.同步数据库 python manage.py syncdb 注意:Django 1.7.1及以上的版本需要用以下命令 python manage.py makemigrations python manage.py migrate 4.调试模式 python manage.py runserver 8001 #监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址) python manage.py runserver 0.0.0.0:8000 5.清除数据库 python manage.py flush 6.创建超级管理员 python manage.py createsuperuser 按照提示就ok 7.修改管理员密码 python manage.py changepassword username(你当时设定的用户名) 8.导入和导出数据 python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json 9.进入数据库 python manage.py dbshell 10.更多命令 python manage.py
CSRF
a. 基本应用 form表单中添加 {% csrf_token %} b. 全站禁用 # ‘django.middleware.csrf.CsrfViewMiddleware‘, c. 局部禁用 ‘django.middleware.csrf.CsrfViewMiddleware‘,
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def csrf1(request): if request.method == ‘GET‘: return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)
d. 局部使用
# ‘django.middleware.csrf.CsrfViewMiddleware‘,
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect def csrf1(request): if request.method == ‘GET‘: return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)
c. 特殊CBV
from django.views import View from django.utils.decorators import method_decorator @method_decorator(csrf_protect,name=‘dispatch‘) class Foo(View): def get(self,request): pass def post(self,request): pass
PS:CBV中添加装饰器
def wrapper(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner # 1. 指定方法上添加装饰器 # class Foo(View): # # @method_decorator(wrapper) # def get(self,request): # pass # # def post(self,request): # pass # 2. 在类上添加 # @method_decorator(wrapper,name=‘dispatch‘) # class Foo(View): # # def get(self,request): # pass # # def post(self,request): # pass
Ajax提交数据时候,携带CSRF:
<form method="POST" action="/csrf1.html"> {% csrf_token %} <input id="user" type="text" name="user" /> <input type="submit" value="提交"/> <a onclick="submitForm();">Ajax提交</a> </form> <script src="/static/jquery-1.12.4.js"></script> <script> 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); } }) } </script>
<form method="POST" action="/csrf1.html"> {% csrf_token %} <input id="user" type="text" name="user" /> <input type="submit" value="提交"/> <a onclick="submitForm();">Ajax提交</a> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> 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); } }) } </script>
models.UserInfo.objects.all().select_related("ut") 在查询userinfo时直接将外键ut关联的表进行inner join连接,这样在for循环的时候就不会再次查询ut那个表 models.UserInfo.objects.all().select_related("ut","gt") inner join 2个表
models.UserInfo.objects.all().prefetch_related("ut") ··· select * from userinfo Django内部:将外键的ID 全部拿到 去重 比如说是[1,2] select * from usertype where id in [1,2] django会把2个select结果集整合。 ···
{{ item }} {% for item in item_list %} <a>{{ item.0 }}</a> <a>{{ item.id }}</a> {% endfor %} {% if ordered_warranty %} {% else %} {% endif %} 母板:{% block title %}{% endblock %} 子板:{% extends "base.html" %} {% block title %}{% endblock %} 组件:include {% include "组件.html" %} pub.html <div> <h3>特别漂亮的组件</h3> <div class="title">标题:{{ name }}</div> <div class="content">内容:{{ name }}</div> </div> test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> {% include ‘pub.html‘ %} {% include ‘pub.html‘ %} {% include ‘pub.html‘ %} </body> </html> 帮助方法: {{ item.event_start|date:"Y-m-d H:i:s"}} {{ bio|truncatewords:"30" }} {{ my_list|first|upper }} {{ name|lower }} PS: ajax先服务器提交信息并等待接受 $.ajax({ url: "/submit/", #向哪个url提交数据 type: "POST", #以某种方式发送POST或者GET data: da, #数据,如果数据中有列表或其他非字符串类型,jquery会对键值做一些处理,可以在后面添加一个属性,traditional:true {"list":[1,2,3]} 发送到后台就会变成{"list[]":[1,2,3]} {"list":[1,2,3]},traditional:true 发送到后台:{"list":[1,2,3]} success: function (data) { #data是从服务器返回的数据 if (data == "false") { $("#msg").text("不能为空!!!"); } else { location.href = data; } } }) 服务端发送回来的只能是字符串,render返回的也是字符串,不会实现跳转。这里值得一提的是可以用json来传送字典。 服务器端: import json dict={"title":1,"id":2} return HttpResponse(json.dumps(dict)) 浏览器ajax success接收: Json.parse(data) 将json字符串data转化成dict Json.stringify(dict) 将dict转化成字符串
a、保存在浏览器端的"键值对",服务端可以向浏览器端写cookie b、浏览器每次发送请求时,会携带cookie 应用: a、投票 b、用户登录 登录时,如果用户名和密码正确,可以写 obj=render(request,"index.html") obj.set_cookie("键","值",max_age=10,path="/") #max_age超时时间,浏览器保存的cookie有效时间。 10秒 #或者expires 他跟的参数是2017年6月21日 11:50:58 #path 指定某个url可以使用当前的cookie path="/index/" /表示所有url都可以用 return obj obj=set_signed_cookie("键","值",salt="加盐操作") 接收端接收cookie cook=request.COOKIES.get("上面中的键") cook=request.get_signed_cookie("键",salt="加盐")
a、保存在服务器端的数据(本质是键值对) b、依赖cookie c、保持会话(web网站) 好处:敏感信息不会直接给客户端
1、数据库中 django默认存放在数据库中 Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) 2、缓存中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 引擎 SESSION_CACHE_ALIAS = ‘default‘ # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 其他同上 3、文件中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 其他同上 4、加密的cookie中 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ # 引擎 5、缓存+数据库 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ # 引擎
# 获取、设置、删除Session中数据 request.session[‘k1‘] #不存在会报错 request.session.get(‘k1‘,None) request.session[‘k1‘] = 123 request.session.setdefault(‘k1‘,123) # 存在则不设置 del request.session[‘k1‘] request.session.delete(request.session.session_key) #删除session request.session.clear() #删除cookie # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") # 设置失效期 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
原文:http://www.cnblogs.com/fortunate/p/7109358.html