首页 > 代码库 > Django整理1

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)
View Code

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=http://www.mamicode.com/"提交"/>
<a onclick="submitForm();">Ajax提交</a>
</form>
<script src=http://www.mamicode.com/"/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=http://www.mamicode.com/"提交"/>
<a onclick="submitForm();">Ajax提交</a>
</form>
<script src=http://www.mamicode.com/"/static/jquery-1.12.4.js"></script>
<script src=http://www.mamicode.com/"/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>
放在请求头中

技术分享

 

技术分享

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个表
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 =http://www.mamicode.com/= "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

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        # 引擎
View Code
技术分享
# 获取、设置、删除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增删改查

 

Django整理1