Django整理

26 篇文章 0 订阅

一、Django的基本结构

│  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

二、Django的基本命令

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

              CSRF # 表示django全局发送post请求均需要字符串验证

               功能:防止跨站请求伪造的功能

                工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端下次访问服务器 端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。

a. 基本应用
form表单中添加
{% csrf_token %}

b. 全站禁用
# 'django.middleware.csrf.CsrfViewMiddleware',

c. 局部禁用
'django.middleware.csrf.CsrfViewMiddleware',

d. 局部使用
# 'django.middleware.csrf.CsrfViewMiddleware',

           1.使用样例

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

           2.局部使用举例

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

             3.特殊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

            4.CBV补充: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>

放在请求头中

 

 

五、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 %}  

    <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转化成字符串

七、COOKIE和SESSION 

       1.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="加盐")

            2. 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增删改查

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值