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:

"POST" action="/csrf1.html"> { % csrf_token %} "user" type="text" name="user" /> "submit" value="提交"/> "submitForm();">Ajax提交
放置在data中携带
"POST" action="/csrf1.html"> { % csrf_token %} "user" type="text" name="user" /> "submit" value="提交"/> "submitForm();">Ajax提交
放在请求头中

 

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

    {
        { item.0 }} 

    {
        { item.id }} 

{
         % endfor %}

{
         % if ordered_warranty %}  

{
         % else %} 

{
         % endif %}

母板:{
         % block title %}{% endblock %}

子板:{
         % extends "base.html" %}
   {
         % block title %}{% endblock %}

    组件:include

     {
         % include "组件.html" %}


    pub.html
        

特别漂亮的组件

class="title">标题:{ { name }}
class="content">内容:{ { name }}
test.html "en"> "UTF-8"> { % 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

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

 12

posted on 2017-07-03 07:50 fortunate7 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/fortunate/p/7109358.html

你可能感兴趣的:(python,数据库,json)