简体   繁体   English

python-bottle + gevent无法提供静态文件

[英]python - bottle+gevent cannot serve static files

I'm using bottle with gevent for my python webdev experiments. 我使用的奶瓶GEVENT我的蟒蛇Webdev的实验。 My problem is that I can't serve static files, eg use external css in my templates. 我的问题是我无法提供静态文件,例如,在模板中使用外部CSS。 My folders structure is: /static/css/style.css 我的文件夹结构是: /static/css/style.css

My code: 我的代码:

index.py index.py

# -*- coding: UTF-8 -*-
from gevent import monkey; monkey.patch_all() #patching default Python threads
from bottle import mount, run, debug #initializing bottle
from routes import root #importing site routes
debug( True )
run( app = root , host = '0.0.0.0' , port = 80 , server = 'gevent' )

routes.py routes.py

# -*- coding: UTF-8 -*-
from bottle import *
root = Bottle()

@root.get('/static/<path:path>')
def serve_files( path ):
    return static_file( path , root = '/static/' )

Here is my traceback from terminal: 这是我对终端的追溯:

xxx.xxx.xxx.xxx - - [2011-12-22 09:36:44] "GET /static/css/style.css HTTP/1.1" 500 161 0.002867
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gevent-0.13.6-py2.7-linux-i686.egg/gevent/pywsgi.py", line 438, in handle_one_response
    self.run_application()
  File "/usr/local/lib/python2.7/dist-packages/gevent-0.13.6-py2.7-linux-i686.egg/gevent/pywsgi.py", line 424, in run_application
    self.result = self.application(self.environ, self.start_response)
  File "/usr/local/lib/python2.7/dist-packages/bottle-0.10.4-py2.7.egg/bottle.py", line 849, in __call__
    return self.wsgi(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/bottle-0.10.4-py2.7.egg/bottle.py", line 841, in wsgi
    % (html_escape(repr(_e())), html_escape(format_exc(10)))
NameError: global name '_e' is not defined

Please, help. 请帮忙。

UPDATE: 更新:

I've downloaded unstable version of Bottle (version 0.11) and import it into my script. 我已经下载了不稳定版本的Bottle(版本0.11)并将其导入到脚本中。 Now there is no 500 errors and tracebacks, but style.css gives me 404. 现在没有500个错误和回溯,但是style.css给了我404。

[2011-12-22 12:42:59] "GET /static/css/style.css HTTP/1.1" 404 122 0.000591

Your 404 is because probably your root path to static files is wrong. 您的404错误是因为静态文件的根目录路径错误。

root='/static/' is ok only if you have a static folder in your root file system. 仅当根文件系统中有一个static文件夹时, root='/static/'才可以。 Probably it is not what you really have. 可能不是您真正拥有的。 If you have a project folder and inside this folder you have a static folder, use root='./static/' and it will work fine. 如果您有一个项目文件夹,并且在此文件夹中有一个static文件夹,请使用root='./static/' ,它将正常工作。

I know this has been answered, but if you want something more production oriented, whitenoise is awesome. 我知道已经解决了这个问题,但是如果您想以生产为导向,那么白噪声很棒。

from app import appRoute
from client import clientRoute
from main import mainRoute
from api import apiRoute
from beaker.middleware import SessionMiddleware
from whitenoise import WhiteNoise
if whitecompress:
    static_compress(whitecompress) # auto mins and gzips all js and css files
botapp = bottle.app()
for nftyRoute in (mainRoute, appRoute, clientRoute, apiRoute):          
    botapp.merge(nftyRoute)
botapp = SessionMiddleware(botapp, beaker_opts)
botapp = WhiteNoise(botapp)
botapp.add_files(staticfolder, prefix='static/')
botapp.add_files('{}/common/img/favicon.ico'.format(staticfolder), prefix='favicon.ico')
print('WhiteNoise Enabled')
WSGIServer(("0.0.0.0", int(port)), botapp, handler_class=WebSocketHandler).serve_forever()

This allows you to post your static files, and it will also handle delivering gzipped files for you automatically. 这使您可以发布静态文件,并且还可以自动为您交付已压缩文件。 I find this solution a tad more robust than the option built into bottle. 我发现此解决方案比瓶子中内置的选项更强大。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM