配置django_rest_framework
setting.py文件配置
REST_FRAMEWORK = {
# "DEFAULT_RENDERER_CLASSES": [JSONRenderer], # 配置全局json格式渲染
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
# 下面这一行表示接口文档的访问权限, AllowAny不做权限限制.
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
}复制
文件模型配置
我们有用到一个文件管理的表、我们需要在setting.py文件配置存放路径
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'复制
配置了这些参数、使用接口上传的文件会自动存放到指定的目录、且会按照我们数据库字段所设置的规则进行存放等
配置OpenAPI
OpenAPI 是什么?
Open API 即开放 API,也称开放平台。所谓的开放 API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列
API(Application Programming Interface,应用编程接口)开放出去,供第三方开发者使用,这种行为就叫做开放网站的 API,所开放的 API 就被称作 OpenAPI(开放 API )。
Swagger 是什么?
Swagger 的目标是为 REST APIs 定义一个标准的,与语言无关的接口,使人和计算机在看不到源码或者看不到文档或者不能通过网络流量检测的情况下能发现和理解各种服务的功能。当服务通过 Swagger 定义,消费者就能与远程的服务互动通过少量的实现逻辑。类似于低级编程接口,Swagger 去掉了调用服务时的很多猜测。
配置swagger ui
在很多的编程语言的应用后台框架中都集成了可以配置swagger ui等功能、django_rest_framework也不例外、不过它比fastapi比较烦的是不会主动给你生成swagger ui 而是需要自己配置:
1、安装swagger ui 工具包
rest_framework_swagger # Django 2.0x使用不能在Django 3.0以上使用
drf_yasg # 仅Django 3.0可用
pip install drf_yasg复制
2、配置drf_yasg
加入settings中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
'system',
'goods',
'drf_yasg',
]复制
配置全局设置setting中
# swagger 配置项
SWAGGER_SETTINGS = {
# 基础样式
'SECURITY_DEFINITIONS': {
"basic":{
'type': 'basic'
}
},
# 如果需要登录才能够查看接口文档, 登录的链接使用restframework自带的.
# 'LOGIN_URL': 'rest_framework:login',
# 'LOGOUT_URL': 'rest_framework:logout',
# 'DOC_EXPANSION': None,
'SHOW_REQUEST_HEADERS':True,
'USE_SESSION_AUTH': True,
'DOC_EXPANSION': 'list',
# 接口文档中方法列表以首字母升序排列
'APIS_SORTER': 'alpha',
# 如果支持json提交, 则接口文档中包含json输入框
'JSON_EDITOR': True,
# 方法列表字母排序
'OPERATIONS_SORTER': 'alpha',
'VALIDATOR_URL': None,
}复制
在urls.py中配置
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from rest_framework import permissions
schema_view = get_schema_view(
openapi.Info(
title="stack商城CMS-API", #文档的标题
default_version='v1', # 版本号
description="stack商城CMS端 API接口文档", # 文档的描述
terms_of_service="",
contact=openapi.Contact(email=""),
license=openapi.License(name="BSD License"),
),
public=True,
permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
path('admin/', admin.site.urls),
# swagger ui 风格
path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
# 对测试人员友好的风格
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]复制
在视图函数中的配置请求参数
token = openapi.Parameter("Token", openapi.IN_HEADER, description="Token",
type=openapi.TYPE_STRING,required=True,)
@swagger_auto_schema(operation_description='获取商品列表,description="",
responses={404: 'id not found'},
# 出入Parameter 的实例
manual_parameters=[token])
def get(self,request):
return Response()复制
编写公共工具方法
1、封装生成token方法、我们需要生成一个token且token需要失效时间
在项目根目录下创建一个common包、新建一个common.py文件用于存放封装的公共方法
目录结构如下:
生成token
def get_token(key, expire=18000):
"""
@Args:
key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
expire: int(最大有效时间,单位为s)
@Return:
state: str
:param key:
:param expire:
:return:
"""
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode("utf-8")
sha1_tshex_str = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()
token = ts_str+':'+sha1_tshex_str
b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
return b64_token.decode("utf-8")复制
token校验
def certify_token(key, token):
"""
@Args:
key: str
token: str
@Returns:
boolean
:param key:
:param token:
:return:
"""
token_str = base64.urlsafe_b64decode(token).decode('utf-8')
token_list = token_str.split(':')
if len(token_list) != 2:
return False
ts_str = token_list[0]
if float(ts_str) < time.time():
return False
known_sha1_tsstr = token_list[1]
sha1 = hmac.new(key.encode("utf-8"), ts_str.encode('utf-8'), 'sha1')
calc_sha1_tsstr = sha1.hexdigest()
if calc_sha1_tsstr != known_sha1_tsstr:
# token certification failed
return False
# token certification success
return True复制
md5加密
md5主要用于加密密码
def md5(data):
import hashlib
pall = str(data)
md5_str = hashlib.md5(pall.encode(encoding='UTF-8')).hexdigest()
return md5_str复制
id生成
生成自定义的id
def getID(index=60):
id = ''
var = '0123456789zxcvbnmasdfghjklqwertyuiopPOIUYTREWQASDFGHJKLMNBVCXZ'
for i in range(index):
name = random.choice(var)
id = name+id
return id复制
目前就先配置以上这些东西后续遇到什么问题再解决什么问题即可。