django笔记
欢迎转载,请支持原创,保留原文链接:blog.ilibrary.me
基础
- 安装django以后就可以用
django-admin
- 创建project:
django-admin startproject HelloWorld
- 创建app: ``
- 创建project:
- 引入当前目录的内容:
from . import views
- 安装xmlsec失败,先安装依赖:
brew install libxml2 libxmlsec1 pkg-config
, https://blog.csdn.net/yuyexiaohan/article/details/107145624 - Disallowed Host:
Invalid HTTP_HOST header: '127.0.0.1:8000'. You may need to add '127.0.0.1' to ALLOWED_HOSTS
- 修改settings.py->’ALLOWED_HOSTS’
- django admin app:
'django.contrib.admin'
- django admin后台地址:
http://localhost:8000/admin
- django admin的默认账号,没有。 需要通过命令创建:
python manage.py createsuperuser
- 给django manager添加命令Django : How can I see a list of urlpatterns?
- django admin列出所有的urls(rails routes等价物), 需要装django-extension:
pip install django-extensions
- 安装app, settings.py->INSTALLED_APPS, 添加
'django_extensions',
- Linkedin登录:
- 官方django例子, 需要把抛错的app删除,然后配置key&secret, 见下面.
- python social auth settings
# settings.py SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY = '77xqioxxxxxxxx' SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET = 'zILxe7jcxxxxxxxx' SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/home/' SOCIAL_AUTH_LOGIN_URL = '/'
- pip 加速:
# ~/.pip/pip.conf [global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com
11.
Django shell
Django shell是和rails console类似的东西. Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
- 打开Django shell:
python manage.py shell
- 导入需要的类型:
from exchange_rate.models import ExchangeRate
- 查看指定模型的所有记录:
ExchangeRate.objects.all()
- 查看指定模型的所有记录的数据:
ExchangeRate.objects.all().values()
- 计数:
ExchangeRate.objects.all().count()
- 查找指定的记录:
ExchangeRate.objects.get(id=1)
- 筛选:
ExchangeRate.objects.filter(author='xxx')
- 创建model object:
er = ExchangeRate(name='xxx');er.save()
ExchangeRate.objects.create(name='xxx')
- 删除object:
ExchangeRate.objects.filter(id='xxx').delete()
Jupyter notebook
django extensions 支持notebook
- 安装依赖:
pip install jupyter
,pip install ipython
- 启动notebook:
./manage.py shell_plus --notebook
Django admin
django-admin.py是Django的一个用于管理任务的命令行工具,manage.py是对django-admin.py的简单包装,每个Django Project里面都会包含一个manage.py.
查看有那些命令: python manage.py help
常用子命令:
- startproject:创建一个项目(*)
- startapp:创建一个app(*)
- runserver:运行开发服务器(*)
- shell:进入django shell(*)
- dbshell:进入django dbshell
- check:检查django项目完整性
- flush:清空数据库
- compilemessages:编译语言文件
- makemessages:创建语言文件
- makemigrations:生成数据库同步脚本(*)
- migrate:同步数据库(*)
- showmigrations:查看生成的数据库同步脚本(*)
- sqlflush:查看生成清空数据库的脚本(*)
- sqlmigrate:查看数据库同步的sql语句(*)
- dumpdata:导出数据
- loaddata:导入数据
- diffsettings:查看你的配置和django默认配置的不同之处
manage.py特有的一些子命令:
- createsuperuser:创建超级管理员(*)
- changepassword:修改密码(*)
- clearsessions:清除session
Admin后台
Django有默认的管理后台。可以自己注册模型,自动生成后台管理页面。
生成后台管理页面的步骤如下:
- 生成模型app:
./manage.py startapp communit
- 把生成的app注册到apps/settings.py里面去:
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', #... 'community' ]
- Community目录下创建
admin.py
, 填入一下内容:from django.contrib import admin # Register your models here. from community.models import Community class CommunityAdmin(admin.ModelAdmin): # Text, Link list_display = ('id', 'text', 'link') # list_display_links = ('id',) # Register your models here. admin.site.register(Community, CommunityAdmin)
Model Query
F表达式:
- An F() object represents the value of a model field. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory. Instead, Django uses the F() object to generate a SQL expression that describes the required operation at the database level.
- F 大概是 field的意思.
- 在遇到F表达式的时候会重写python为SQL语句,而不执行python语句
- F表达式直接在数据库层面操作
- F Expression
- 一个F()对象代表一个模型字段的值或注释列。使用它可以直接引用模型字段的值并执行数据库操作而不用把它们导入到python的内存中。
F表达式的应用场景:
- 避免竞争条件
- 当两个线程同时进行操作,在第一个线程正在操作还未保存的时候,第二个进程进行取值,修改,保存。则第一个操作的值被覆盖丢失。但是由数据库操作的时候则不会出现此种情况。
- 用于Queryset中的过滤
- F()的实例作为查询中的模型字段的引用。可以用于两个不同字段比较
- 支持加减乘除模幂操作,支持位操作
Q表达式,~Q表达式:
- A Q() object, like an F object, encapsulates a SQL expression in a Python object that can be used in database-related operations. In general, Q() objects make it possible to define and reuse conditions. This permits the construction of complex database queries using | (OR) and & (AND) operators; in particular, it is not otherwise possible to use OR in QuerySets.
- 将SQL表达式封装在可用于数据库相关操作的Python对象中
- 支持构造复杂的数据库查询
- 支持 OR AND NOT操作
Celery
Hello world
- 异步任务神器 Celery 快速入门教程
- 创建
tasks.py
:# -*- coding: utf-8 -*- import time from celery import Celery broker = 'redis://127.0.0.1:6379' backend = 'redis://127.0.0.1:6379/0' app = Celery('my_task', broker=broker, backend=backend) @app.task def add(x, y): time.sleep(5) # 模拟耗时操作 return x + y
celery worker -A tasks --loglevel=info
- 在python shell里面:
from tasks import add
Djcelery integration
- enable
djcelery
inINSTALLED_APPS
:INSTALLED_APPS += ("djcelery", )
- add following lines in
settings.py
:import djcelery djcelery.setup_loader()
常用命令
- python manage.py celery worker
- python manage.py celery beat
- supervisorctl
- tail -f djceler_work
- @shared_task 装饰器能让你在没有具体的 Celery 实例时创建任务.
refs
- 在 Django 项目中使用 Celery
- 异步任务神器 Celery 快速入门教程
- DJCelery official doc
- Django Celery source code git
Django extensions
Django extensions 是django admin的扩展。
- show urls:
./manage.py show_urls
- shell plus:
./manage.py shell_plus
- 运行脚本, django extension自动导入django配置:
- 在项目根目录下,创建script文件夹:
mkdir scripts && touch scripts/__init__.py
- 创建一个脚本文件:
touch scripts/delete_all_questions.py
- 再次,写脚本。注:代码必须写在 run() 函数下。
# scripts/delete_all_questions.py from polls.models import Question def run(): # Fetch all questions questions = Question.objects.all() # Delete questions questions.delete()
- 最后,运行脚本
python manage.py runscript delete_all_questions python manage.py runscript delete_all_questions --traceback # 开启 Debug 模式
- 在项目根目录下,创建script文件夹:
- 启动jupyter notebook:
./manage.py shell_plus --notebook
- 需要安装依赖:
pip install jupyter && pip install ipython
- 不太好用。第二次打开shell_plus book的时候会抛错。
- 需要安装依赖:
Http
-
返回json数据 把数据库记录打包成json格式返回.
@action(methods=['GET'], detail=False) def index(self, request): start = request.query_params.get('start_at') if not start: start = datetime.now() - timedelta(days=30) # by default, start from 30 days before end = request.query_params.get('end_at') if not end or start >= end: end = datetime.now() print("querying exchange rate from {} to {}".format(start, end)) exchanges = ExchangeRate.objects.filter(timestamp__range=[start, end]).all() serializer_class = ExchangeRateSerializer data = serializers.serialize('json', exchanges) return HttpResponse(data, content_type='application/json')
-
返回json数据 把hash打包成json格式返回.
ret = { a: 'bbb'} return HttpResponse(json.dumps(ret), content_type='application/json;charset=utf8')
Python基础
Python Env
django的很多库对Python版本敏感。建议用conda指定python小版本创建env。