视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Django遇到的地雷,大家要注意
2020-11-27 14:23:26 责编:小采
文档


最近在折腾Django的WSGI应用,虽然Django自带的runserver很方便,但是对于复杂的功能它就为力了。

首先在Windows上遇到坑了,然后在windows10自带的Ubuntu遇到坑了,最后在虚拟机上总算解决了。

从以前的文章Django笔记《Django 学习笔记(二)第一个网页》可以看出我用的是windows10系统中的cmd来进行Django操作的,由于gunicorn应用是在unix系统中运行的,强制性在win平台运行就出错了。

1.windows遇到坑:

首先 cmd中输入:pip3 install gunicorn ,安装成功后,切换到项目目录(G:/Django/hello),具体操作是先切换到G盘,直接输入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 named 'pwd',没有pwd模块,好吧,没有找呗。找到后的代码贴在下面了,把找到的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:Djangohello>gunicorn hello.wsgi
Traceback (most recent call last):
 File "d:program filespythonpython36lib
unpy.py", line 193, in _run_module_as_main"__main__", mod_spec)
 File "d:program filespythonpython36lib
unpy.py", line 85, in _run_codeexec(code, run_globals)
 File "D:Program FilesPythonPython36Scriptsgunicorn.exe\__main__.py", line 5, in <module>
 File "d:program filespythonpython36libsite-packagesgunicornappwsgiapp.py", line 10, in <module>from gunicorn.app.base import Application
 File "d:program filespythonpython36libsite-packagesgunicornappase.py", line 12, in <module>from gunicorn import util
 File "d:program filespythonpython36libsite-packagesgunicornutil.py", line 13, in <module>import pwd
ModuleNotFoundError: No module named 'pwd'

ModuleNotFoundError: No module named 'pwd'

from os import * 
from pwd import * 

def get_username():return getpwuid(getuid())[0]

pwd.py

G:Djangohello>gunicorn hello.wsgi
Traceback (most recent call last):
 File "d:program filespythonpython36lib
unpy.py", line 193, in _run_module_as_main"__main__", mod_spec)
 File "d:program filespythonpython36lib
unpy.py", line 85, in _run_codeexec(code, run_globals)
 File "D:Program FilesPythonPython36Scriptsgunicorn.exe\__main__.py", line 5, in <module>
 File "d:program filespythonpython36libsite-packagesgunicornappwsgiapp.py", line 10, in <module>from gunicorn.app.base import Application
 File "d:program filespythonpython36libsite-packagesgunicornappase.py", line 13, in <module>from gunicorn.arbiter import Arbiter
 File "d:program filespythonpython36libsite-packagesgunicornarbiter.py", line 18, in <module>from gunicorn import sock, systemd, util
 File "d:program filespythonpython36libsite-packagesgunicornsock.py", line 101, in <module>class UnixSocket(BaseSocket):
 File "d:program filespythonpython36libsite-packagesgunicornsock.py", line 103, in UnixSocket
 FAMILY = socket.AF_UNIX
AttributeError: module 'socket' has no attribute 'AF_UNIX'

AttributeError: module 'socket' has no attribute 'AF_UNIX'

2.win10平台自带Ubuntu遇到的坑

win10开启Linux系统:首先,在win10设置-->安全与更新-->针对开发人员-->开发人员模式-->打钩,然后在控制面板-->程序个功能-->启动或关闭windows功能-->适用于Linux的windows子系统(Bata)-->打勾,最后用管理员运行shell-->输入cmd-->输入bash-->按照操作下载安装Linux。

安装完毕后,用管理员身份shell进入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 install 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 , 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.django 在Linux里面无法安装mysqlclient,这个时候安装PyMySQL,运行django项目会报错,只需要在一个文件加入一句话即可。

项目根目录下,找到对应app目录下的__init__.py,添加这一句:

import pymysql

pymysql.install_as_MySQLdb()

例子:

我的项目是eagle,在eagle下有manage.py这个文件,同时还有你自己的app,在这个app下有view.py这个文件。

2.nginx里面的static格式注意,使用location /static/ 和 location /static 加载时是不同的,要根据html中的格式符合。

3.搞了一天才了解的一个问题,大部分教程都是说开启uwsgi --ini eagle.ini链接uwsgi和django,然后开启nginx,但是,

如果你的eagle.ini中没有添加log路径,不会被后台运行,这个时候只能关闭uwsgi,

然后开启nginx,当你在浏览器输入地址后,发现502错误,查看/var/log/nginx/myweb_error.log,发现报错息 ,恭喜你入坑了。

原因是刚刚的uwsgi被关闭,你没有重启,网上的很多人都不知道这个原因。。

坑爹啊,乱七八糟的回答。根据我的方式,有两种方法,一种是开启nginx后再运行

uwsgi --ini eagle.ini,一种是在eagle.ini添加log路径后会自动后台运行

下载本文
显示全文
专题