>  기사  >  백엔드 개발  >  모두가 Django가 마주한 지뢰에 주목해야 합니다.

모두가 Django가 마주한 지뢰에 주목해야 합니다.

巴扎黑
巴扎黑원래의
2018-05-16 14:30:019653검색

저는 최근 Django의 WSGI 애플리케이션을 만져보고 있습니다. Django의 자체 실행 서버는 매우 편리하지만 복잡한 기능에는 무력합니다.

처음에는 Windows에서 함정에 직면했고 그 다음에는 Windows 10과 함께 제공되는 Ubuntu에서 마침내 가상 머신에서 문제를 해결했습니다.

Django를 운영하기 위해 Windows 10 시스템에서 cmd를 사용하는 것은 이전 글 Django Notes "Django 학습 노트(2) 첫 번째 웹 페이지"에서 볼 수 있습니다. Gunicorn 응용 프로그램은 Unix 시스템에서 실행되므로 필수입니다. Win 플랫폼에서 실행할 때 오류가 발생했습니다.

1. Windows에서는 함정이 발생합니다.

먼저 cmd에 pip3 install gunicorn을 입력합니다. 설치가 성공한 후 프로젝트 디렉터리(G:/Django/hello)로 전환합니다. 먼저 G: 를 직접 입력한 다음 cd Djangohello 를 입력하면 G: Djangohello>가 나타납니다. 그런 다음 Django 프로젝트에서 형식은 gunicorn yourproject.wsgi [-b 127.0.0.1.8000]입니다. 다른 명령 매개변수의 경우 gunicorn -h를 보내 도움말 문서를 얻을 수 있습니다. . 여기 내 프로젝트는 hello이므로 내 명령 작업은 gunicorn hello.wsgi입니다. 그런 다음 오류가 발생합니다: ModuleNotFoundError: 'pwd'라는 모듈이 없습니다. pwd 모듈이 없습니다. 알겠습니다. 찾을 수 없습니다. 발견된 코드는 아래에 게시되어 있습니다. 발견된 pwd.py를 python3 설치 디렉터리 D:Program FilesPythonPython36Lib에 넣었습니다. 그런 다음 gunicorn hello.wsgi를 실행했는데 그 결과 또 다른 오류가 발생했습니다: AttributeError: module 'socket' has no attribute 'AF_UNIX' 그러다가 인터넷에서 찾아보니 유닉스 시스템에서는 gunicorn이라 liunx에서는 sock.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 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'

AttributeError: 'socket' 모듈에 'AF_UNIX' 속성이 없습니다

2. win10 플랫폼과 함께 제공되는 Ubuntu에서 직면하는 함정

win10에서 Linux 시스템 시작: 먼저 win10 설정->보안 및 업데이트-->개발자용-->개발자 모드-로 이동합니다. -> 선택하고 제어판-->프로그램 기능-->Windows 기능 켜기 또는 끄기-->Linux용 Windows 하위 시스템(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- 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] 프로토콜을 사용할 수 없습니다. 나중에 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 명령이 성공적으로 시작되었고 Failed to find application이 나타나지 않았으며 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] 프로토콜을 사용할 수 없습니다

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. 위의 루틴을 따르고 한 번에 서비스를 성공적으로 시작합니다. 또한 win10에서 겪었던 문제에 대해서도 생각해보고 피트 2를 성공적으로 채웠습니다.

다른 문제는 다음과 같습니다.

1. Linux에 Django가 mysqlclient를 설치할 수 없습니다. 이때 PyMySQL을 설치하면 django 프로젝트를 실행할 때 오류가 보고됩니다. 파일에 문장만 추가하면 됩니다.

프로젝트 루트 디렉터리에서 해당 앱 디렉터리에서 __init__.py를 찾아 다음 문장을 추가하세요.

import pymysql

pymysql.install_as_MySQLdb()

예:

내 프로젝트는 Eagle이고 아래에 관리가 있습니다. Eagle .py 파일과 자신의 앱이 있습니다. 이 앱 아래에 view.py 파일이 있습니다.

2. nginx의 정적 형식에 유의하세요. /static/ 위치를 사용한 로드는 html 형식에 따라 일관성이 있어야 합니다.

3. 문제를 이해하는 데 하루가 걸렸습니다. 대부분의 튜토리얼에서는 uwsgi와 django를 연결하기 위해 uwsgi --ini Eagle.ini를 열고 nginx를 열라고 합니다. 그러나

eagle에 로그를 추가하지 않으면. ini 경로는 백그라운드에서 실행되지 않습니다. 이때는 uwsgi,

만 닫은 다음 nginx를 열 수 있습니다. 브라우저에 주소를 입력하면 /var/log/nginx/를 확인합니다. myweb_error.log를 방문하여 오류 메시지를 찾으세요. 트랩에 걸린 것을 축하합니다.

이유는 uwsgi가 방금 종료되었는데 다시 시작하지 않았기 때문입니다. 인터넷상의 많은 사람들이 이 이유를 모릅니다. . .

이런 사기, 이렇게 엉망인 답변이군요. 내 방법에는 두 가지 방법이 있는데, 하나는 nginx를 열고

uwsgi --ini Eagle.ini를 실행하는 것이고, 다른 하나는 Eagle.ini에 로그 경로를 추가하면 백그라운드에서 자동으로 실행되는 것입니다

위 내용은 모두가 Django가 마주한 지뢰에 주목해야 합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.