基础


常用命令

django-admin startproject sitename 创建项目

python manage.py runserver 0.0.0.0 启动服务

python manage.py startapp appname 创建app

python manage.py makemigrations 检索数据库

python manage.py migrate 创建数据库

python manage.py createsuperuser 创建超级用户

配置文件


1、数据库

DATABASES = {

    'default': {

    'ENGINE': 'django.db.backends.mysql',

    'NAME':'dbname',

    'USER': 'root',

    'PASSWORD': 'xxx',

    'HOST': '',

    'PORT': '',

    }

}


模板

TEMPLATE_DIRS = (

        os.path.join(BASE_DIR,'templates'),

    )


静态文件

STATICFILES_DIRS = (

        os.path.join(BASE_DIR,'static'),

    )


ajax

1、ajax提交提交单条数据到django

function AjaxSubmit(){

var host = "1.1.1.1";

var port = "9999";

$.ajax({

url: "/ajax_data/",

type: 'POST',

data: {h:host, p:port},

success: function(arg){

}

});

}

django接收数据

def ajax_data(request):

    print request.POST['h']

    return HttpResponse('ok')


2、ajax提交包含多条数据的元祖

function AjaxSubmitSet(){

var array_users= [

{'username': 'alex', 'age': 18},

{'username': 'rain', 'age': 16},

{'username': 'eric', 'age': 17}

];

$.ajax({

url: "/ajax_data_set/",

type: 'POST',

tradition: true,

data: {data: JSON.stringify(array_users)},

success: function(arg){

// json.loads

var callback_dict = $.parseJSON(arg);

if(callback_dict.status){

alert('成功');

}else{

alert(callback_dict.error);

}

}

});

}


django接受数据

def ajax_data_set(request):

    ret = {'status': True, 'error':""}

    try:

        print request.POST

    except Exception,e:

        ret['status'] = False

        ret['error'] = str(e)


    return HttpResponse(json.dumps(ret))

session

request.session 可以在视图中任何地方使用,它类似于python中的字典

session 默认有效时间为两周,可以在 settings.py 中修改默认值

# 创建或修改 session:

request.session[key] = value

# 获取 session:

request.session.get(key,default=None)

# 删除 session

del request.session[key] # 不存在时报错



用户认证


登入一个用户

如果你有一个认证了的用户,你想把它附带到当前的会话中 - 这可以通过login()函数完成。

login()

从视图中登入一个用户,请使用login()。它接受一个HttpRequest对象和一个User对象。login()使用Django的会话框架来将用户的ID保存在会话中。

注意任何在匿名会话中设置的数据都会在用户登入后的会话中都会记住。

下面的示例向你演示如何使用authenticate() 和login():

from django.contrib.auth import authenticate, login

def my_view(request):

username = request.POST['username']

password = request.POST['password']

user = authenticate(username=username, password=password)

if user is not None:

if user.is_active:

login(request, user)

# Redirect to a success page.

else:

# Return a 'disabled account' error message

else:

# Return an 'invalid login' error message.

Web请求中的认证

Django使用会话和中间件来拦截request 对象到认证系统中。

它们在每个请求上提供一个request.user属性,表示当前的用户。如果当前的用户没有登入,该属性将设置成AnonymousUser的一个实例,否则它将是User的实例。

你可以通过is_authenticated()区分它们,像这样:

if request.user.is_authenticated():

# Do something for authenticated users.

else:

# Do something for anonymous users.

如何登出一个用户

logout()

若要登出一个已经通过django.contrib.auth.login()登入的用户,可以在你的视图中使用django.contrib.auth.logout()。 它接收一个HttpRequest对象且没有返回值。例如:

from django.contrib.auth import logout

def logout_view(request):

logout(request)

只允许登录的用户访问

原始的方法

from django.conf import settings

from django.shortcuts import redirect


def my_view(request):

if not request.user.is_authenticated():

return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_required 装饰器

login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=None])[source]

login_required()完成下面的事情:

如果用户没有登入,则重定向到settings.LOGIN_URL,并传递当前查询字符串中的绝对路径。例如:/accounts/login/?next=/polls/3/。

如果用户已经登入,则正常执行视图。视图的代码可以安全地假设用户已经登入。

默认情况下,在成功认证后用户应该被重定向的路径存储在查询字符串的一个叫做"next"的参数中。如果对该参数你倾向使用一个不同的名字,login_required()带有一个可选的redirect_field_name参数:

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')

def my_view(request):

...

注意,如果你提供一个值给redirect_field_name,你非常可能同时需要自定义你的登录模板,因为存储重定向路径的模板上下文变量将使用redirect_field_name值作为它的键,而不是默认的"next"。

login_required()还带有一个可选的login_url参数。例如:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')

def my_view(request):

...

注意,如果你没有指定login_url参数,你需要确保settings.LOGIN_URL与你的登录视图正确关联。例如,使用默认值,可以添加下面几行到你的URLconf中:

from django.contrib.auth import views as auth_views

url(r'^accounts/login/$', auth_views.login),

settings.LOGIN_URL同时还接收视图函数名和命名的URL模式。这允许你自由地重新映射你的URLconf中的登录视图而不用更新设置。