最近有个比较紧急的需求,要做一个web网站应用,内部应用、并发量也不会大,希望在最短的时间写最少的代码来实现,团队的兄弟现在用python
的比较多,为了快速完成工作,学了django
在此总结,便于后人上手。
python3.9
Django 3.2
djangorestframework 3.12.4
django
go
语言的兄弟肯定知道beego
,属于是那种大而全的api
开发框架,结合 beego/admin 自动生成一个后台管理界面。py
里django
已经属于是一个相当老的框架了,它将数据库的东西通过ORM
的映射取出来,通过view
文件,按照template
文件排出的模板渲染成HTML
。当用户请求相应的url
时,返回相应的结果。
在没有做mvc
的时间这东西很方便,就类似于jsp
或者go template
。
创建项目
django-admin startproject mysite
运行(后面的ip:端口指定可省略)
python manage.py runserver [0:8000]
目录结构
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
创建一个应用(polls
是应用名,只是一个示例,可以取任意名字)
python manage.py startapp polls
目录结构
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
具体各个文件什么作用我实在懒得解释了,建议先看看 tutorial01 ,可以切换相应的django
版本,有问题直接问我就好。
创建orm
, polls/models.py
解释见tutorial02
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
接下来还得在setting.py
里配置app
和数据库链接配置,都看tutorial02
构造数据库 DDL 语句,polls
是可选的,不写默认构建所有model
的DDL
,存储为python
格式。
python manage.py makemigrations [polls]
查看将执行的sql
命令
python manage.py sqlmigrate polls 0001
执行sql
变更
python manage.py migrate
管理员账号创建,创建完访问 /admin
就可以了,自带了权限管理
python manage.py createsuperuser
因为还是打算前后端分离写能返回json
的api
出来,所以关于怎么弄页面并集成在里面的就不用关心了
django
官网里的以下教程还是有用的,可以自由了解,属于是锦上添花的内容。
DRF(Django REST framework)
将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json
DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。
Django的tutorial讲的是Django的ORM、template、url、admin以及Django怎么run起来等基础知识。
而DRF的tutorial讲的是serializers怎么写,view怎么写,在drf中view这一层既可以一个个get、post、从头开始写起,也可以采用抽象程度比较高的viewset去按配置生成。另外还讲了一些drf升级和新增的功能。
也就是说我们只要完成上一节的model
,套一下代码就能自动生成CURD
django-filter==21.1
django-log-request-id==1.6.0
django-mysql==4.3.0
使用与接入
1.安装
pip install pymysql djangorestframework django-filter
#settings.py的INSTALLED_APPS中添加:
NSTALLED_APPS = [
...
'django_filters',
'rest_framework',
'rest_framework.authtoken',
'rest_framework_filters',
'app',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
'rest_framework.permissions.DjangoModelPermissions',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
rest_framework.authentication.BasicAuthentication
#'app.common.auth.YoozooTokenAuthentication' 自定义认证,
),
'PAGE_SIZE': 15,
'DEFAULT_PAGINATION_CLASS': 'app.common.page.YoozooPage',
'PAGINATE_BY_PARAM': 'limit',
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter'
),
}
在_init_.py
添加如下代码
( MySQLdb不支持python3,所以在python3下使用pymysql替代。)
import pymysql
pymysql.install_as_MySQLdb()
2.数据库models
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
3.序列化
from rest_framework import serializers
class TestSerializer(serializers.ModelSerializer):
class Meta:
#与test表对应
model = Test
#取全部字段
fields = '__all__'
4.过滤filter
from django_filters.rest_framework import FilterSet
class TestFilter(FilterSet):
class Meta:
model = Test
fields = '__all__'
5.视图viewset
from rest_framework import viewsets
class TestViewSet(viewsets.ModelViewSet):
filter_class = TestFilter
queryset = Test.objects.all()
serializer_class = TestSerializer
6.修改url
from django.conf.urls import url, include
from django.contrib import admin
from django.urls import path
from rest_framework import routers
import app.ormrest as orm
import app.views as views
router = routers.DefaultRouter()
router.register(r'test', orm.resapply.ResapplyViewSet)
urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^api/', include(router.urls)),
]
成了,这样子就完成了一套CURD
,访问 /api/test
就能调用了
内建接口文档自动生成
在setting.py
里追加如下配置
REST_FRAMEWORK = {
....
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}
在urls.py
里追加如下配置
from rest_framework.documentation import include_docs_urls
urlpatterns = [
url(r'^api/v1/docs/', include_docs_urls(title="文档标题", description="描述",permission_classes=[], authentication_classes=[])),
]
这样就可以自动生成文档了。详见Built-in API documentation
依赖或可选的 Package:
- coreapi Package 是本特性的依赖项,确保安装最新版本哦(2.3.0 或更高版本)
- pygments Package 编程代码高亮(可选)
- markdown Package markdown 语法高亮(可选)
命令小结
创建项目
django-admin startproject mysite
运行(后面的ip:端口指定可省略)
python manage.py runserver [0:8000]
创建一个应用(polls
是应用名,只是一个示例,可以取任意名字)
python manage.py startapp polls
构造数据库 DDL 语句,polls
是可选的,不写默认构建所有model
的DDL
,存储为python
格式。
python manage.py makemigrations [polls]
查看将执行的sql
命令
python manage.py sqlmigrate polls 0001
执行sql
变更
python manage.py migrate
管理员账号创建,创建完访问 /admin
就可以了,自带了权限管理
python manage.py createsuperuser
评论