Django整理1
基本结构
│ 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:
select_related:主动连表
models.UserInfo.objects.all().select_related("ut") 在查询userinfo时直接将外键ut关联的表进行inner join连接,这样在for循环的时候就不会再次查询ut那个表 models.UserInfo.objects.all().select_related("ut","gt") inner join 2个表
prefetch_related :不做连表,做多次查询
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 %} { { item.0 }} { { item.id }} { % endfor %} { % if ordered_warranty %} { % else %} { % endif %} 母板:{ % block title %}{% endblock %} 子板:{ % extends "base.html" %} { % block title %}{% endblock %} 组件:include { % include "组件.html" %} pub.htmltest.html "en"> "UTF-8">特别漂亮的组件
class="title">标题:{ { name }}class="content">内容:{ { name }}{ % include 'pub.html' %} { % include 'pub.html' %} { % include 'pub.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转化成字符串
COOKIE和SESSION
COOKIE 向服务器发送存在请求头里。服务器发送到浏览器存在响应头里。
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="加盐")
SESSION
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失效策略。
12
posted on
2017-07-03 07:50 fortunate7 阅读(
...) 评论(
...) 编辑 收藏