最近 Django の WSGI アプリケーションをいじっています。Django 独自のランサーバーは非常に便利ですが、複雑な機能については何もできません。
最初に Windows で問題が発生し、次に Windows 10 に付属の Ubuntu で問題が発生し、最後に仮想マシンで問題を解決しました。
前回の記事「Django 学習メモ (2) 最初の Web ページ」からわかるように、Windows 10 システムで Django を操作するには cmd を使用しています。gunicorn アプリケーションは Unix システムで実行されるため、必須です。 winプラットフォームで実行すると問題が発生しました。
1. Windows は落とし穴に遭遇します:
まず cmd: pip3 install gunicorn を入力します。インストールが成功したら、プロジェクト ディレクトリ (G:/Django/hello) に切り替えます。最初に G: と直接入力し、次に cd Djangohello と入力すると、G: Djangohello> が表示されます。次に、gunicorn を実行します。Django プロジェクトの形式は次のとおりです: gunicorn yourproject.wsgi [-b 127.0.0.1.8000] 他のコマンド パラメーターについては、gunicorn -h を送信してヘルプ ドキュメントを取得できます。 。ここでの私のプロジェクトは hello なので、コマンド操作は次のようになります: gunicorn hello.wsgi 次に、次のエラーが発生します: ModuleNotFoundError: No module names 'pwd', there is no pwd module, ok, I can't find it.見つかったコードは以下に掲載されています。見つかった pwd.py を python3 インストール ディレクトリ D:Program FilesPythonPython36Lib に配置しました。次に、gunicorn hello.wsgi を実行しました。結果は別のエラーでした。AttributeError: module 'socket' has no attribute 'AF_UNIX'。と思ってインターネットで探したのですが、unix系ではgunicornだったのでliunxではsock.pyファイルが見つからず、unix系に切り替えてWindowsを諦めました。
G:\Django\hello>gunicorn hello.wsgi Traceback (most recent call last): File "d:\program files\python\python36\lib\runpy.py", line 193, in _run_module_as_main"__main__", mod_spec) File "d:\program files\python\python36\lib\runpy.py", line 85, in _run_codeexec(code, run_globals) File "D:\Program Files\Python\Python36\Scripts\gunicorn.exe\__main__.py", line 5, in <module> File "d:\program files\python\python36\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>from gunicorn.app.base import Application File "d:\program files\python\python36\lib\site-packages\gunicorn\app\base.py", line 12, in <module>from gunicorn import util File "d:\program files\python\python36\lib\site-packages\gunicorn\util.py", line 13, in <module>import pwd ModuleNotFoundError: No module named 'pwd'
ModuleNotFoundError: 'pwd'という名前のモジュールがありません
from os import * from pwd import * def get_username():return getpwuid(getuid())[0]
pwd.py
G:\Django\hello>gunicorn hello.wsgi Traceback (most recent call last): File "d:\program files\python\python36\lib\runpy.py", line 193, in _run_module_as_main"__main__", mod_spec) File "d:\program files\python\python36\lib\runpy.py", line 85, in _run_codeexec(code, run_globals) File "D:\Program Files\Python\Python36\Scripts\gunicorn.exe\__main__.py", line 5, in <module> File "d:\program files\python\python36\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>from gunicorn.app.base import Application File "d:\program files\python\python36\lib\site-packages\gunicorn\app\base.py", line 13, in <module>from gunicorn.arbiter import Arbiter File "d:\program files\python\python36\lib\site-packages\gunicorn\arbiter.py", line 18, in <module>from gunicorn import sock, systemd, util File "d:\program files\python\python36\lib\site-packages\gunicorn\sock.py", line 101, in <module>class UnixSocket(BaseSocket): File "d:\program files\python\python36\lib\site-packages\gunicorn\sock.py", line 103, in UnixSocket FAMILY = socket.AF_UNIX AttributeError: module 'socket' has no attribute 'AF_UNIX'
属性エラー: モジュール「ソケット」には属性「AF_UNIX」がありません
2. win10 プラットフォームに伴う Ubuntu の落とし穴
win10 で Linux システムを起動します。まず、win10 の設定 -> セキュリティとアップデート -> 開発者向け -> 開発者モード - に移動します。 -> チェックを入れて、「コントロール パネル」-->「プログラムの機能」-->「Windows の機能をオンまたはオフにする」-->「Windows Subsystem for Linux (Bata)」--> チェックを入れ、最後に管理者としてシェルを実行します。 - ->cmd と入力 -->bash と入力 -->指示に従って、Linux をダウンロードしてインストールします。
インストールが完了したら、管理者シェルを使用して cmd を入力し、 bash を入力して Linux システムに入ります。システムにはデフォルトで python2.7 と python3.5 がインストールされています。 Python のデフォルトの起動は python2 です。デフォルトの Python を python3 に設定できます:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 200
最初に pip3 をインストールするルーチンに従います (pip を直接インストールすると、デフォルトで python2 にインストールされます): sudo apt- get install python3-pip、次に pip を使用して Django をインストールします: sudo pip3 install Django、最後に pip を使用して gunicorn をインストールします: sudo pip3 install gunicorn (現在自動的にインストールされるバージョンは 19.7.1)。環境のインストール後、プロジェクト アドレス cd /mnt/g/Django/hello に切り替えて、gunicorn hello.wsgi と入力すると、再びエラーが発生します。 OSError: [Errno 92] Protocol not available. その後、pip をアンインストールした後、gunicorn が python-gunicorn (19.4.5) に依存していることがわかったので、gunicorn (19.7.1) をアンインストールしました。 pip3 uninstall gunicorn を実行してから、gunicorn ( 19.4.5) :pip3 インストール gunicorn==19.4.5。その後、コマンド gunicorn hello.wsgi が正常に開始され、「アプリケーションの検索に失敗しました」は表示されず、127.0.0.1:8000/admin/ に正常にアクセスされました。
Lee@Kein:/mnt/g/Django/hello$ gunicorn hello.wsgi [2017-07-16 15:16:25 +0800] [428] [INFO] Starting gunicorn 19.7.1Traceback (most recent call last): File "/usr/local/lib/python3.5/dist-packages/gunicorn/sock.py", line 44, in set_options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) OSError: [Errno 92] Protocol not available During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/bin/gunicorn", line 11, in <module>sys.exit(run()) File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 74, in run WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run() File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/base.py", line 203, in run super(Application, self).run() File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/base.py", line 72, in run Arbiter(self).run() File "/usr/local/lib/python3.5/dist-packages/gunicorn/arbiter.py", line 198, in run self.start() File "/usr/local/lib/python3.5/dist-packages/gunicorn/arbiter.py", line 157, in start self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds) File "/usr/local/lib/python3.5/dist-packages/gunicorn/sock.py", line 180, in create_sockets sock = sock_type(addr, conf, log) File "/usr/local/lib/python3.5/dist-packages/gunicorn/sock.py", line 32, in __init__self.sock = self.set_options(sock, bound=bound) File "/usr/local/lib/python3.5/dist-packages/gunicorn/sock.py", line 89, in set_optionsreturn super(TCPSocket, self).set_options(sock, bound=bound) File "/usr/local/lib/python3.5/dist-packages/gunicorn/sock.py", line 46, in set_optionsif err[0] not in (errno.ENOPROTOOPT, errno.EINVAL): TypeError: 'OSError' object is not subscriptable
OSError: [Errno 92] Protocol not available
Lee@Kein:/mnt/g/Django/hello$ gunicorn hello.wsgi [2017-07-16 15:22:16 +0800] [470] [INFO] Starting gunicorn 19.4.5[2017-07-16 15:22:16 +0800] [470] [INFO] Listening at: http://127.0.0.1:8000 (470) [2017-07-16 15:22:16 +0800] [470] [INFO] Using worker: sync [2017-07-16 15:22:17 +0800] [473] [INFO] Booting worker with pid: 473Not Found: /static/admin/css/base.css Not Found: /static/admin/css/login.css
3. 仮想マシンに ubuntu システムをインストールし、上記のルーチンに従って、一度にサービスを正常に開始します。 win10で遭遇した問題も考えて、ピット2を埋めることに成功しました。
その他の問題は次のとおりです:
1. この時点で PyMySQL をインストールすると、ファイルに文を追加するだけでエラーが報告されます。
プロジェクトのルート ディレクトリで、対応するアプリ ディレクトリの __init__.py を見つけて、次の文を追加します:
import pymysql
pymysql.install_as_MySQLdb()
例:
私のプロジェクトは eagle で、以下に manage があります。 eagle .py ファイルと独自のアプリの下に、view.py ファイルがあります。
2. nginx での静的形式は、location /static/ と location /static を使用して異なることに注意してください。
3. 1 日作業して初めて理解した問題。ほとんどのチュートリアルでは、uwsgi --ini eagle.ini を開き、uwsgi と django をリンクしてから nginx を開くように指示されています。ただし、
を追加しない場合。現時点では、uwsgi を閉じ、
してから nginx を開くと、/var/ を確認してください。 log/nginx/myweb_error.log を参照して、エラー メッセージを見つけます。トラップに成功しました。
その理由は、uwsgi がたった今シャットダウンされ、インターネット上の多くの人がこの理由を知りません。 。 。
なんという詐欺だ、そのようなめちゃくちゃな答え。私の方法によると、2つの方法があり、1つはnginxを開いて
uwsgi --ini eagle.iniを実行する方法で、もう1つはログのパスをeagle.iniに追加し、バックグラウンドで自動的に実行される方法です
以上が誰もがジャンゴが遭遇した地雷に注意する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。