Django整理1

时间:2023-03-08 21:49:19

基本结构

│  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>

放置在data中携带

<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>

放在请求头中

Django整理1

Django整理1

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 全部拿到 去重 比如说是[,]
select * from usertype where id in [,] django会把2个select结果集整合。 ···

模版语言

{{ item }}

{% for item in item_list %}  

    <a>{{ item. }}</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:"" }}
{{ my_list|first|upper }}
{{ name|lower }} PS:
ajax先服务器提交信息并等待接受 $.ajax({
url: "/submit/", #向哪个url提交数据
type: "POST", #以某种方式发送POST或者GET
data: da, #数据,如果数据中有列表或其他非字符串类型,jquery会对键值做一些处理,可以在后面添加一个属性,traditional:true {"list":[,,]} 发送到后台就会变成{"list[]":[,,]} {"list":[,,]},traditional:true 发送到后台:{"list":[,,]} success: function (data) { #data是从服务器返回的数据
if (data == "false") {
$("#msg").text("不能为空!!!");
}
else {
location.href = data;
}
} })
服务端发送回来的只能是字符串,render返回的也是字符串,不会实现跳转。这里值得一提的是可以用json来传送字典。
服务器端:
import json
dict={"title":,"id":}
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=,path="/") #max_age超时时间,浏览器保存的cookie有效时间。 10秒 #或者expires 他跟的参数是2017年6月21日 ::
#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失效策略。

session增删改查

12