初始模板的相关文件都在 https://gitee.com/yaaakaaang/django_swagger_docker 的一个项目模板里,可以拿来用。 下面我们来详细看看是怎么构建的。
一、创建项目
首先我们在pycharm中新建一个项目test
然后打开终端输入
django-admin startproject backendbackend就是我们的项目名。
打开manage.py点击右下角配置 python 解释器,然后选择一个解释器就好了。
为防止混淆 把backend\backend的文件名改为backend\application
然后在重构预览里 直接点重构。如果弹出一个框,就再点击继续,没有就不管。
二、配置settings.py
打开backend\application\settings.py
把ALLOWED_HOSTS = []改为ALLOWED_HOSTS = locals().get("ALLOWED_HOSTS", ["*"])
在INSTALLED_APPS = [...]的下面添加
INSTALLED_APPS+=['drf_yasg',# 基于Swagger规范,生成API文档'rest_framework',# 构建Web API'rest_framework.authtoken',# 生成和管理API令牌(Token)'rest_framework_simplejwt',# 生成、验证和刷新JWT的功能'rest_framework_simplejwt.token_blacklist',# 管理已签发的JWT令牌的黑名单'corsheaders',# 添加cors应用]在MIDDLEWARE中django.middleware.common.CommonMiddleware的上面添加一行
MIDDLEWARE=[...'corsheaders.middleware.CorsMiddleware',# 设置跨域中间件'django.middleware.common.CommonMiddleware',...]接着在下面添加
# 配置允许的域CORS_ALLOW_ALL_ORIGINS=True# 配置允许的头CORS_ALLOW_HEADERS=('accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with',)# 配置允许的方法CORS_ALLOW_METHODS=('DELETE','GET','OPTIONS','PATCH','POST','PUT',)然后我们来修改数据库配置,把
DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',}}修改为
# 配置MySQL数据库DATABASES={"default":{'ENGINE':'django.db.backends.mysql',# mysql数据库版本建议:8.0'NAME':'test-mysql','HOST':'test-mysql','PORT':'3306','USER':'root','PASSWORD':'root',}}顺便把时区也修改了
# 设置时区LANGUAGE_CODE='zh-Hans'TIME_ZONE='Asia/Shanghai'三、安装需要的包
打开pycharm终端,输入
pipinstalldrf-yasg pipinstallrest_framework_simplejwt pipinstalldjangorestframework-simplejwt pipinstalldjango-cors-headers pipinstallmysqlclient pipinstallcelery四、创建并注册应用
好了,接下来我们可以创建应用了。
打开pycharm终端,依次输入
cdbackendmkdirapps\FirstApp python manage.py startapp FirstApp apps\FirstAppFirstApp就是我们的第一个应用名。
修改backend\apps\FirstApp\apps.py
name='apps.FirstApp'然后把新创建的应用注册到settings.py
INSTALLED_APPS+=['apps.FirstApp',]五、写路由
首先写主路由。
在application\urls.py中把这段代码替换上去
fromdjango.conf.urls.staticimportstaticfromdjango.urlsimportpath,include,re_pathfromdrf_yasgimportopenapifromdrf_yasg.viewsimportget_schema_viewfromrest_frameworkimportpermissionsfromapplicationimportsettings schema_view=get_schema_view(openapi.Info(title="Snippets API",default_version="v1",description="Test description",terms_of_service="https://www.google.com/policies/terms/",contact=openapi.Contact(email="contact@snippets.local"),license=openapi.License(name="BSD License"),),public=True,permission_classes=(permissions.AllowAny,),)urlpatterns=([re_path(r"^swagger(?P<format>\.json|\.yaml)$",schema_view.without_ui(cache_timeout=0),name="schema-json",),path("",schema_view.with_ui("swagger",cache_timeout=0),name="schema-swagger-ui",),path(r"redoc/",schema_view.with_ui("redoc",cache_timeout=0),name="schema-redoc",),re_path(r"^api-auth/",include("rest_framework.urls",namespace="rest_framework")),path('api/home/',include("apps.FirstApp.urls")),# 第一个应用]+static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)# 配置media和static文件+static(settings.STATIC_URL,document_root=settings.STATIC_URL))如果像这样有红色下波浪线
就右键backend,鼠标移到最下面将目录标记为,然后点击源代码根目录就行了。还不行就重启一下pycharm。
接下来写分布式路由
先在backend\apps\FirstApp中 新建文件urls.py,把这段代码复制上去
fromdjango.urlsimportpathfrom.viewsimportFirstAppView urlpatterns=[path('firstAppView',FirstAppView.as_view(),name='firstAppView'),# 第一个应用方法]然后在backend\apps\FirstApp\ views.py中
fromrest_framework.viewsimportAPIViewclassFirstAppView(APIView):""" 第一个应用方法 """defget(self,request):pass这样我们就写好了一个简单的视图。
六、异步
在settings.py同级目录下新建文件celery.py
importloggingimportosfromceleryimportCeleryfromcelery.utils.logimportget_task_loggerfromapplicationimportsettings os.environ.setdefault('DJANGO_SETTINGS_MODULE','application.settings')app=Celery('app_group',broker='redis://test-redis:6379/0',backend='redis://test-redis:6379/1')# 获取 Celery 自带的日志记录器logger=get_task_logger('my_celery_logger')redis_password=os.getenv('REDIS_PASSWORD','000000')app.config_from_object({'broker_url':f'redis://:{redis_password}@test-redis:6379/0','result_backend':f'redis://:{redis_password}@test-redis:6379/1','timezone':'Asia/Shanghai',})# 自动发现所有注册了任务的 Django appapp.autodiscover_tasks(settings.INSTALLED_APPS)七、静态文件
在settings.py最下面 添加
importos# 设置django的静态文件目录STATICFILES_DIRS=[os.path.join(BASE_DIR,"static"),os.path.join(BASE_DIR,"media"),]MEDIA_ROOT="media"MEDIA_URL="/media/"然后把 文件夹static放在 和manage.py的同目录下,
文件夹static在 https://gitee.com/yaaakaaang/django_swagger_docker 中有。
八、运行脚本
在manage.py同级目录下新建空文件__init__.py。
在 https://gitee.com/yaaakaaang/django_swagger_docker 中中有 找到文件docker_start.sh
把文件docker_start.sh复制到相同位置。打开它看右下角,如果是CRLF,则点击CRLF改为LF,不是就不用改。
在相同位置新建requirements.txt
asgiref==3.5.2certifi==2021.5.30chardet==4.0.0coreapi==2.3.3coreschema==0.0.4Django==3.2.19django-comment-migrate==0.1.7django-cors-headers==3.10.1django-filter==22.1django-ranged-response==0.2.0django-redis==5.2.0django-restql==0.15.3django-simple-captcha==0.5.17django-tenants==3.5.0django-timezone-field==5.0djangorestframework==3.14.0djangorestframework-simplejwt==5.2.2packaging==23.0drf-yasg==1.21.5idna==2.10inflection==0.5.1itypes==1.2.0Jinja2==3.1.2MarkupSafe==2.0.1mysqlclient==2.1.1Pillow==9.4.0PyJWT==2.6.0pyparsing==2.4.7pyPEG2==2.15.2pypinyin==0.48.0pytz==2021.1requests==2.28.0ruamel.yaml==0.17.10ruamel.yaml.clib==0.2.4six==1.16.0smmap==4.0.0sqlparse==0.4.1typing-extensions==3.10.0.0tzlocal==2.1ua-parser==0.10.0uritemplate==3.0.1urllib3==1.26.15user-agents==2.2.0whitenoise==5.3.0openpyxl==3.1.2channels==3.0.5channels-redis==3.4.1uvicorn==0.21.1gunicorn==20.1.0gevent==22.10.2websockets==10.4修改 nginx 配置
在最外层backend同级目录下放入文件docker-compose.yml和文件夹web、docker_env。
这些文件在 https://gitee.com/yaaakaaang/django_swagger_docker 中有。
最终目录结构是这样
打开命令提示符,输入ipconfig,找到 IPv4 地址 ,比如 10.1.13.92
然后修改文件docker_env\nginx\my.conf
server_name10.1.13.92;...location/static{alias/backend/static/;proxy_pass http://10.1.13.92:8080/swagger/static/;}把10.1.13.92换成你的IPv4 地址。
最后在pycharm 终端运行
docker-composeup就可以访问http://10.1.13.92:8080/swagger/(这里同样把10.1.13.92 换成你的IPv4 地址)