zoukankan      html  css  js  c++  java
  • windows+django3.1+ASGI+nginx部署

    # 了解CGI

    CGI(通用网关接口, Common Gateway Interface/CGI),定义客户端与Web服务器的交流方式的一个程序。

    #  什么是WSGI

    PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
    WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
    WSGI标准在 PEP 333中定义并被许多框架实现,django框架支持WSGI(3.0以上版本也支持)接口协议。

    #  什么是ASGI

    ASGI(异步网关协议接口,Asynchronous Server Gateway Interface)一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型。

    WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展

    Django3.0以后支持ASGI了, 在21年3月份我做本练习的时候,Django的版本为3.1.7.  3.2Bata版也已经发布, 安装Django的惯例,3.2版本应该就是长期支持版, 即时,在Django上编写异步代码的人也会越来越多.

    #  异步视图的HelloDjangoWorld:

    from django.http import HttpResponse 
     
    async def index(request):
        return HttpResponse("Hello, async Django!")

    #  我将在在windows和linux下分别尝试一下用ASGI部署生产环境,本随笔记录一下windows环境下安装和配置过程.

    1. 下载nginx, 最新的stable版本是1.18.0,  链接http://nginx.org/download/nginx-1.18.0.zip

    2.无需安装,绿色版,解压缩到一个文件夹下,等一下进行配置.

    3. 使用Django内置开发测试服务器,项目可以启动,但实际上它不会真正异步运行,按照Django官方手册,我们需要用Uvicorn来启动项目。手册链接 https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/uvicorn/

    (env)$python -m pip install uvicorn gunicorn

    创建一个Django项目,用uvicorn启动项目:

    (env)$ django-admin.py startproject hello_async
    (env)$ gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker  #Django官方手册的方法

    报错了:

    Traceback (most recent call last):
    File "D:PythonPython39lib unpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
    File "D:PythonPython39lib unpy.py", line 87, in _run_code
    exec(code, run_globals)
    File "E:PycharmProjectsdjango-async-viewsenvScriptsgunicorn.exe\__main__.py", line 4, in <module>
    File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappwsgiapp.py", line 9, in <module>
    from gunicorn.app.base import Application
    File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappase.py", line 11, in <module>
    from gunicorn import util
    File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornutil.py", line 9, in <module>
    import fcntl
    ModuleNotFoundError: No module named 'fcntl'

    提示缺少模块 "fcnt1", 那尝试安装一下

    python -m pip install fcntl

    报错

    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
    ERROR: Could not find a version that satisfies the requirement fcnt1
    ERROR: No matching distribution found for fcntl

    尝试不使用gunicorn 管理uvicorn.

    uvicorn hello_async.asgi:application

    显示:

    INFO:     Started server process [13780]
    INFO:     Waiting for application startup.
    INFO:     ASGI 'lifespan' protocol appears unsupported.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

    成功运行,也能用浏览器访问到. 

    阅读uvicorn手册,链接 https://www.uvicorn.org/deployment/  ,发现这句

    The following will start Gunicorn with four worker processes:
    
    gunicorn -w 4 -k uvicorn.workers.UvicornWorker
    
    The UvicornWorker implementation uses the uvloop and httptools implementations.uvicorn.
    workers.UvicornWorker方法,需要调用uvloop, 我尝试安装uvloop
    python -m pip install  uvloop
    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
    Collecting uvloop
      Using cached https://pypi.tuna.tsinghua.edu.cn/packages/44/6e/0cb292e4e6ee1382e2ede458f90c94b4f990b261f738403ac45cb8183bc2/uvloop-0.15.2.tar.gz (2.1 MB)
        ERROR: Command errored out with exit status 1:
         command: 'E:PycharmProjectsdjango-async-viewsenvScriptspython.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"'; __file__='"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'
    '"'"', '"'"'
    '"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:UsersimxinAppDataLocalTemppip-pip-egg-info-dxbd5o6z'
             cwd: C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263
        Complete output (5 lines):
        Traceback (most recent call last):
          File "<string>", line 1, in <module>
          File "C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263setup.py", line 8, in <module>
            raise RuntimeError('uvloop does not support Windows at the moment')
        RuntimeError: uvloop does not support Windows at the moment   #  不支持windows

    :这跟找不到fcntl模块虽说完全没关系, 看来按照官方的方法, 既然workers.UvicornWorker需要调用uvloop, 但uvloop又不支持windows, 目前是不可能部署到windows server的, 我个人认为兄弟们暂时不用尝试填坑了.

    心得总结: 

    在windows下尝试使用ASGI部署django3.1,部署失败一半,为什么说失败一半呢?因为按照官方文档, Gunicorn是在生产环境中运行和管理Uvicorn的最简单方法, 但是比如用 gunicorn -w 4 -k uvicorn.workers.UvicornWorker 以四个工作进程启动Gunicorn的时候,UvicornWorker的实现使用uvloophttptools, uvloop模块并不支持windows. 如果不用Gunicorn, 仅仅使用uvicorn是成功的,但这与生产环境的要求就不符了. 

  • 相关阅读:
    彻底理解 Python 生成器
    Windows上虚拟环境的安装及使用
    github怎么绑定自己的域名
    解决ImportError: cannot import name HTTPSHandler
    服务器(Linux) 安装python3
    函数的参数(必选,默认,可变,关键字)
    python 异常处理(try...finally...和with...as 方法)
    LeetCode 33. 搜索旋转排序数组 | Python
    LeetCode 46. 全排列
    LeetCode 面试题51. 数组中的逆序对
  • 原文地址:https://www.cnblogs.com/worldinmyeyes/p/14527293.html
Copyright © 2011-2022 走看看