Heim  >  Artikel  >  Backend-Entwicklung  >  Jeder sollte auf die Landminen achten, auf die Django stößt

Jeder sollte auf die Landminen achten, auf die Django stößt

巴扎黑
巴扎黑Original
2018-05-16 14:30:019648Durchsuche

Ich habe in letzter Zeit an der WSGI-Anwendung von Django herumgebastelt. Obwohl Djangos eigener Runserver sehr praktisch ist, kann er für komplexe Funktionen nichts tun.

Zuerst bin ich auf ein Problem unter Windows gestoßen, dann auf ein Problem unter Ubuntu, das mit Windows 10 geliefert wird, und schließlich habe ich es auf der virtuellen Maschine gelöst.

Aus dem vorherigen Artikel Django Notes „Django Learning Notes (2) First Web Page“ können Sie ersehen, dass ich cmd im Windows 10-System verwende, um Django zu bedienen, da sich die Gunicorn-Anwendung im Unix-System befindet Wann Beim Ausführen tritt ein Fehler auf, wenn die Ausführung auf der Win-Plattform erzwungen wird.

1. Windows stößt auf eine Grube:

Geben Sie zuerst in cmd ein: pip3 install gunicorn. Wechseln Sie in das Projektverzeichnis (G:/Django/hello). Der Vorgang besteht darin, zuerst zum Laufwerk G zu wechseln, G: direkt einzugeben und dann cd Djangohello G: Djangohello> einzugeben. Führen Sie dann gunicorn aus. Im Django-Projekt lautet das Format: gunicorn yourproject.wsgi [-b 127.0.0.1.8000]. Für andere Befehlsparameter können Sie gunicorn -h senden, um die Hilfedokumentation zu erhalten . Mein Projekt hier ist Hallo, also lautet meine Befehlsoperation: gunicorn hello.wsgi. Dann tritt ein Fehler auf: ModuleNotFoundError: Kein Modul mit dem Namen „pwd“, es gibt kein pwd-Modul, okay, ich kann es nicht finden. Der gefundene Code wird unten gepostet. Wir haben die gefundene Datei pwd.py im Python3-Installationsverzeichnis D:Program FilesPythonPython36Lib abgelegt. Dann haben wir gunicorn hello.wsgi ausgeführt und das Ergebnis war ein weiterer Fehler: AttributeError: module 'socket' has no attribute 'AF_UNIX'. , und dann habe ich im Internet danach gesucht, weil es im Unix-System gunicorn war, konnte ich die sock.py-Datei in liunx nicht finden, also bin ich auf das Unix-System umgestiegen und habe Windows aufgegeben.

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: Kein Modul namens „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'

AttributeError: Modul 'Socket' hat kein Attribut 'AF_UNIX '

2. Die mit der Win10-Plattform verbundenen Fallstricke

Öffnen Sie das Linux-System unter Win10: Gehen Sie zunächst zu den Win10-Einstellungen--> -> Für Entwickler-->Entwicklermodus-->Überprüfen, dann zur Systemsteuerung gehen-->Programmfunktionen-->Windows-Funktionen aktivieren oder deaktivieren-->Windows-Subsystem für Linux (Bata) -- >Klicken Sie auf und führen Sie schließlich die Shell als Administrator aus.-->Geben Sie cmd ein.-->Geben Sie bash ein.-->Folgen Sie den Anweisungen zum Herunterladen und Installieren von Linux.

Geben Sie nach Abschluss der Installation cmd mit der Shell als Administrator ein und geben Sie bash ein, um das Linux-System aufzurufen. Auf dem System sind standardmäßig Python2.7 und Python3.5 installiert. Der Standardstart von Python ist Python2. Sie können den Standardpython auf Python3 festlegen:

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

Folgen Sie der Routine, um zuerst pip3 zu installieren (falls Pip installiert ist). direkt, es wird standardmäßig in Python2 installiert) ): sudo apt-get install python3-pip, dann verwenden Sie pip, um Django zu installieren: sudo pip3 install Django, und schließlich verwenden Sie pip, um gunicorn zu installieren: sudo pip3 install gunicorn (das wird automatisch installiert Version ist jetzt 19.7.1). Wechseln Sie nach der Installation der Umgebung zur Projektadresse: cd /mnt/g/Django/hello und geben Sie dann gunicorn hello.wsgi ein. Es tritt erneut ein Fehler auf. OSError: [Errno 92] Protokoll nicht verfügbar. Später, nach der Deinstallation von pip, stellte ich fest, dass Gunicorn von Python-Gunicorn (19.4.5) abhängt, also habe ich Gunicorn (19.7.1) deinstalliert: pip3 uninstall gunicorn und dann Gunicorn installiert ( 19.4.5) :pip3 install gunicorn==19.4.5. Dann wurde der Befehl gunicorn hello.wsgi erfolgreich gestartet, „Anwendung konnte nicht gefunden werden“ wurde nicht angezeigt und auf 127.0.0.1:8000/admin/ wurde erfolgreich zugegriffen.

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] Protokoll nicht verfügbar

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. Installieren Sie das Ubuntu-System auf der virtuellen Maschine und befolgen Sie die obige Routine, um den Dienst auf einmal erfolgreich zu starten. Ich habe auch über die Probleme bei Win10 nachgedacht und Pit 2 erfolgreich ausgefüllt.

Einige andere Probleme sind:

1. Bei der Installation von PyMySQL und der Ausführung des Django-Projekts wird derzeit ein Fehler gemeldet ist das Hinzufügen eines Satzes zu einer Datei.

Suchen Sie im Projektstammverzeichnis __init__.py im entsprechenden App-Verzeichnis und fügen Sie diesen Satz hinzu:

import pymysql

pymysql.install_as_MySQLdb()

Beispiel:

Mein Projekt ist Eagle. Unter Eagle gibt es auch eine eigene App.

2. Beachten Sie, dass das statische Format in nginx und das Laden unter /static je nach Format in HTML unterschiedlich sein müssen.

3. Die meisten Tutorials sagen, dass ich uwsgi --ini eagle.ini öffnen und dann nginx öffnen soll Sie Es wurde kein Protokollpfad zu eagle.ini hinzugefügt und es wird nicht im Hintergrund ausgeführt. Sie können uwsgi nur

schließen und dann nginx öffnen, wenn Sie die Adresse im Browser eingeben , Sie werden einen 502-Fehler finden. Überprüfen Sie /var/log/nginx/myweb_error.log, finden Sie die Fehlermeldung, herzlichen Glückwunsch, dass Sie in die Falle getappt sind.

Der Grund dafür ist, dass uwsgi gerade heruntergefahren wurde und Sie es nicht neu gestartet haben. Viele Leute im Internet kennen diesen Grund nicht. . .

Was für eine Abzocke, so eine chaotische Antwort. Nach meiner Methode gibt es zwei Methoden: Eine besteht darin, Nginx zu öffnen und dann

uwsgi --ini eagle.ini auszuführen. Die andere besteht darin, den Protokollpfad zu eagle.ini hinzuzufügen und automatisch auszuführen der Hintergrund

Das obige ist der detaillierte Inhalt vonJeder sollte auf die Landminen achten, auf die Django stößt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn