Maison >développement back-end >Tutoriel Python >Tout le monde devrait faire attention aux mines terrestres rencontrées par Django

Tout le monde devrait faire attention aux mines terrestres rencontrées par Django

巴扎黑
巴扎黑original
2018-05-16 14:30:019714parcourir

J'ai récemment bricolé l'application WSGI de Django. Bien que le propre serveur d'exécution de Django soit très pratique, il ne peut rien faire pour les fonctions complexes.

J'ai d'abord rencontré un problème sous Windows, puis j'ai rencontré un problème sur Ubuntu fourni avec Windows 10, et enfin je l'ai résolu sur la machine virtuelle.

D'après l'article précédent Django Notes "Django Learning Notes (2) First Web Page", vous pouvez voir que j'utilise cmd dans le système Windows 10 pour faire fonctionner Django, puisque l'application gunicorn est dans le système Unix Quand en cours d'exécution, une erreur se produit lorsqu'il est forcé de s'exécuter sur la plateforme Win.

1. Windows rencontre un gouffre :

Entrez d'abord dans cmd : pip3 install gunicorn Une fois l'installation réussie, passez au répertoire du projet (G:/Django/hello). L'opération consiste à basculer d'abord sur le lecteur G, entrez directement G:, puis entrez cd Djangohello G: Djangohello> Exécutez ensuite gunicorn. Dans le projet Django, le format est : gunicorn yourproject.wsgi [-b 127.0.0.1.8000]. Les champs entre parenthèses sont facultatifs. Pour les autres paramètres de commande, vous pouvez envoyer gunicorn -h pour obtenir la documentation d'aide. . Mon projet ici est bonjour, donc mon opération de commande est : gunicorn hello.wsgi Ensuite, une erreur se produit : ModuleNotFoundError : Aucun module nommé 'pwd', il n'y a pas de module pwd, d'accord, je ne le trouve pas. Le code trouvé est publié ci-dessous. Nous avons mis le pwd.py trouvé dans le répertoire d'installation de python3 D:Program FilesPythonPython36Lib Ensuite, nous avons exécuté gunicorn hello.wsgi et le résultat a été une autre erreur : AttributeError : le module 'socket' n'a pas d'attribut 'AF_UNIX'. , puis je l'ai cherché sur Internet. Parce que c'était gunicorn dans le système Unix, je n'ai pas pu trouver le fichier sock.py dans Liunx, alors je suis passé au système Unix et j'ai abandonné 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 : aucun module nommé '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 : le module 'socket' n'a pas d'attribut 'AF_UNIX '

2. Les pièges rencontrés par Ubuntu fourni avec la plateforme win10

Ouvrez le système Linux sur win10 : Tout d'abord, accédez aux paramètres win10--> -> Pour les développeurs-->Mode développeur-->Vérifiez, puis accédez au Panneau de configuration-->Fonctionnalités du programme-->Activer ou désactiver des fonctionnalités Windows-->Sous-système Windows pour Linux (Bata) -- >Cochez, et enfin exécutez le shell en tant qu'administrateur-->Entrez cmd-->Entrez bash-->Suivez les instructions pour télécharger et installer Linux.

Une fois l'installation terminée, entrez cmd avec shell en tant qu'administrateur et entrez bash pour accéder au système Linux. Le système a python2.7 et python3.5 installés par défaut. Le démarrage par défaut de python est python2. Vous pouvez définir le python par défaut sur 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

Suivez la routine pour installer pip3 en premier (si pip est installé). directement, il sera installé dans python2 par défaut) ) : sudo apt-get install python3-pip, puis utilisez pip pour installer Django : sudo pip3 install Django, et enfin utilisez pip pour installer gunicorn : sudo pip3 install gunicorn (le logiciel installé automatiquement la version est maintenant 19.7.1). Une fois l'environnement installé, passez à l'adresse du projet : cd /mnt/g/Django/hello, puis entrez gunicorn hello.wsgi, et une erreur se produit à nouveau. OSError : [Errno 92] Protocole non disponible. Plus tard, après avoir désinstallé pip, j'ai découvert que gunicorn dépend de python-gunicorn (19.4.5), j'ai donc désinstallé gunicorn (19.7.1) : pip3 désinstalle gunicorn, puis j'ai installé gunicorn ( 19.4.5) :pip3 install gunicorn==19.4.5. Ensuite, la commande gunicorn hello.wsgi a démarré avec succès, l'application Failed to find application n'est pas apparue et l'accès à 127.0.0.1:8000/admin/ a été réussi.

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] Protocole non disponible

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. Installez le système Ubuntu sur la machine virtuelle et suivez la routine ci-dessus pour démarrer avec succès le service en une seule fois. J'ai également réfléchi aux problèmes rencontrés sur win10 et rempli avec succès le pit 2.

Quelques autres problèmes sont :

1. Django ne peut pas installer mysqlclient sous Linux À ce stade, lors de l'installation de PyMySQL et de l'exécution du projet Django, une erreur sera signalée. c'est ajouter une phrase à un fichier.

Dans le répertoire racine du projet, recherchez __init__.py dans le répertoire de l'application correspondant et ajoutez cette phrase :

import pymysql

pymysql.install_as_MySQLdb()

Exemple :

Mon projet est eagle. Il y a un fichier manage.py sous eagle, et vous avez également votre propre application. Sous cette application, il y a un fichier view.py.

2. Notez le format statique dans nginx. Le chargement à l'aide de location /static/ et location /static est différent selon le format en html.

3. Il m'a fallu une journée pour comprendre un problème. La plupart des tutoriels disent d'ouvrir uwsgi --ini eagle.ini pour lier uwsgi et django, puis d'ouvrir nginx. Vous Aucun chemin de journal n'est ajouté à eagle.ini et il ne sera pas exécuté en arrière-plan. Pour le moment, vous ne pouvez fermer que uwsgi,

puis ouvrir nginx lorsque vous entrez l'adresse dans le navigateur. , vous trouverez une erreur 502. Vérifiez /var/ log/nginx/myweb_error.log, vous avez trouvé le message d'erreur, félicitations pour être tombé dans le piège.

La raison est que uwsgi vient d'être arrêté et que vous ne l'avez pas redémarré. De nombreuses personnes sur Internet ne connaissent pas cette raison. . .

Quelle arnaque, une réponse tellement brouillonne. Selon ma méthode, il existe deux méthodes, l'une consiste à ouvrir nginx puis à exécuter

uwsgi --ini eagle.ini, l'autre consiste à ajouter le chemin du journal à eagle.ini et il s'exécutera automatiquement dans le fond

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn