生成工程
安装:
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官方文档
查看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