Django admin 创建工程

生成工程

安装:

pip install django

创建工程:

django-admin.py  startproject pykins  

创建应用

django-admin.py  startapp app 

注册 app 到工程:

vim pykins/settings.py
	INSTALLED_APPS = [
		  'django.contrib.admin',
		  'django.contrib.auth',
		  'django.contrib.contenttypes',
		  'django.contrib.sessions',
		  'django.contrib.messages',
		  'django.contrib.staticfiles',
		  'app'
	]

生成数据库表单

python manage.py migrate

创建超级用户

python manage.py createsuperuser

运行工程:

python manage.py runserver

migrate 和 makemigrations 的区别

python manger.py makemigrations
	相当于 在该app下建立 migrations目录,并记录下你所有的关于 modes.py 的改动,比如 0001_initial.py, 但是这个改动还没有作用到数据库文件	
python manage.py migrate
	直接作用到数据库

遇到问题

无法更新数据库

python manage.py 
	makemigrations No changes detected

解决:

python manage.py makemigrations app_name

‘WSGIRequest’ object has no attribute ‘user’

这是Django版本的问题,1.10之前,中间件的key为MIDDLEWARE_CLASSES, 1.10之后,为MIDDLEWARE。

解决:

MIDDLEWARE = [
	.....
]

改为:

MIDDLEWARE_CLASSES = [
	.....
]

增加 bootstrap:

bootstrap:

pip install django-admin-bootstrapped

INSTALLED_APPS = [
    'django_admin_bootstrapped',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
]

bootstrap3:

pip install  django-bootstrap3

INSTALLED_APPS = [
    'django_admin_bootstrapped.bootstrap3',
    'django_admin_bootstrapped',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
]

报错:

ImportError: No module named bootstrap3

解决:

INSTALLED_APPS = [
    'bootstrap3',
    'django_admin_bootstrapped',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
]

汉化:

增加 django.middleware.locale.LocaleMiddleware

MIDDLEWARE_CLASSES = [
	'django.middleware.security.SecurityMiddleware',
	'django.contrib.sessions.middleware.SessionMiddleware',
	'django.middleware.common.CommonMiddleware',
	'django.middleware.csrf.CsrfViewMiddleware',
	'django.contrib.auth.middleware.AuthenticationMiddleware',
	'django.contrib.messages.middleware.MessageMiddleware',
	'django.middleware.clickjacking.XFrameOptionsMiddleware',
	'django.middleware.locale.LocaleMiddleware',
]

sqllite 客户端:
直接打开 django 生成的 db.sqlite3 文件即可

http://blog.qianrushi.org/topic/59f9929c0e8491115f5314e5

参考:

http://www.huangwenchao.com.cn/2014/02/django-tip-2.html

使用django-celery完成异步任务

pip install django-celery

修改 settings.py:

import djcelery
djcelery.setup_loader()
BROKER_URL = 'django://' # 告诉Celery使用Django项目作为broker

# Application definition

INSTALLED_APPS = [
    'bootstrap3',
    'django_admin_bootstrapped',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'djcelery',
    'kombu.transport.django',
]    

生成数据表:

python manage.py migrate

一个task就是一个Pyhton function. 但Celery需要知道这一function是task,
当settings.py中的 djcelery.setup_loader() 运行时,
Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件,
找到标记为task的function, 并将它们注册为celery task。
将function标注为task并不会妨碍他们的正常执行. 你还是可以像平时那样调用它: z = add(1, 2)。
因此我们可以使用celery自带的装饰器decorator: @task. 在django app目录中创建taske.py:

from celery import task

@task()
def add(x, y):
    return x + y

Celery会将task加入到queue中, 并马上返回. 而在一旁待命的worker看到该task后,
便会按照设定执行它, 并将他从queue中移除. 而worker则会执行以下代码:

import app.tasks.add
app.tasks.add(2, 2) 

启动task

打开新的terminal, 并切换到django项目目录:

$ python manage.py shell
	>>> from app.tasks import add
	>>> add.delay(2, 2)    

此时, 你可以在worker窗口中看到worker执行该task

在 web 请求中执行

# views.py
from app.tasks import do_something_with_form_data

def view(request):
    form = SomeForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        # Schedule a task to process the data later
        do_something_with_form_data.delay(data)
    return render_to_response(...)
    
# tasks.py

@task
def do_something_with_form_data(data):
    call_slow_web_service(data['user'], data['text'], ...)

Eager 模式

如果在settings.py设置:

CELERY_ALWAYS_EAGER = True

那么Celery便以eager模式运行, 则task便不需要加delay运行:

# 若启用eager模式, 则以下两行代码相同
add.delay(2, 2)
add(2, 2)

定时任务

还有一种Celery的常用模式便是执行定期任务. 执行定期任务时,
Celery会通过celerybeat进程来完成. Celerybeat会保持运行,
一旦到了某一定期任务需要执行时,Celerybeat便将其加入到queue中.
不像worker进程, Celerybeat只有需要一个即可.

启动Celerybeat:

python manage.py celery beat

使Celery运行定期任务的方式有很多种, 我们先看第一种, 将定期任务储存在django数据库中.
即使是在django和celery都运行的状态, 这一方式也可以让我们方便的修改定期任务.
我们只需要设置settings.py中的一项便能开启这一方式:

# settings.py
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'


Name: 这一定期任务的注册名
Task (registered): 可以选择所有已经注册的task之一, 例如前面的add function
Task (custom): task的全名, 例如 app.tasks.add, 但最好还是用以上项
Enabled: 是否开启这一定期任务
Interval: 定期任务的间隔时间, 例如每隔5分钟
Crontab: 如果希望task在某一特定时间运行, 则使用Unix中的Crontab代替interval
Arguments: 用于传参数到task中
Execution Options: 更高级的设置, 在此不详细说明, 请查看celery官方文档

worker 参数

查看queue

因为我们使用了django作为broker, queue储存在django的数据库中. 这就意味着我们可以通过django admin查看该queue:

# admin.py
from django.contrib import admin
from kombu.transport.django import models as kombu_models

admin.site.register(kombu_models.Message)

安装并启动flower(默认会启动一个webserver,端口为5555):

pip install flower
python manage.py celery flower

使用 Redis

pip install redis

设置 Redis 数据库的位置:

BROKER_URL = ‘redis://localhost:6379/0’

URL 的格式为:

redis://password@hostname:port/db_number

在 Redis 中存储任务的状态和返回值:

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

使用 celery beat,注释 djcelery.schedulers.DatabaseScheduler , 因为默认为 celery.beat:PersistentScheduler.

# CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

使用 uwsgi 样式丢失 ----未解决

STATIC_ROOT = BASE_DIR + '/static/'
STATIC_URL = '/static/'

STATICFILES_DIRS = [
	os.path.join(BASE_DIR, "static"),
]

执行

python manage.py collectstatic #收集Django项目中所有涉及到的静态资源,放到 STATIC_ROOT 中

启动

uwsgi --http :9911 --chdir /root/pykins^C--wsgi-file /root/pykins/pykins/wsgi.py