2012-06-07 46 views
4

因此,我已经成功部署了一个使用webapp2/jinja2和Paste服务器的应用程序,但在服务静态样式表时遇到了问题。在Google App Engine之外使用webapp2的样式表

我有运气通过this method访问静态文件,以及实施StaticFileHandler我发现了一些谷歌福:

import os 
import mimetypes 
import webapp2 
import logging 

class StaticFileHandler(webapp2.RequestHandler): 
    def get(self, path): 
     abs_path = os.path.abspath(os.path.join(self.app.config.get('webapp2_static.static_file_path', 'static'), path)) 
     if os.path.isdir(abs_path) or abs_path.find(os.getcwd()) != 0: 
      self.response.set_status(403) 
      return 
     try: 
      f = open(abs_path, 'r') 
      self.response.headers.add_header('Content-Type', mimetypes.guess_type(abs_path)[0]) 
      self.response.out.write(f.read()) 
      f.close() 
     except: 
      self.response.set_status(404) 

在我的主要的应用程序路由的样子:

app = webapp2.WSGIApplication([('/', HelloWorld), 
           (r'/display', DisplayHandler), 
           (r'/static/(.+)', StaticFileHandler) 
           ], debug=True) 

我的css文件位于应用程序根目录下的文件夹中:/static/css/main.css

我可以通过直接url访问该文件,甚至可以将其作为样式表链接,bu样式不适用。有任何想法吗?是否有另一种方式来服务样式表?一些实现类似于GAE的app.yaml的方法?

回答

0

你不需要一个静态文件处理程序。
加给你的 app.yaml

- url: /static/ 
    static_dir: static 
上传与静态文件夹中的应用

文档是在这里: https://developers.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

编辑: 看到评论

+0

我没有使用GAE,我在我自己的服务器上运行webapp2,并使用粘贴服务它。 – Mnemon

+0

哦,没有得到... sry – aschmid00

+0

是样式表头设置正确吗? – aschmid00

0

@Mnemon,帽子下面回答给你解决我的问题。我会鼓励你,但我不允许这样做。你说服了我,如果它不是没有GAE的唯一webapp2方法,那至少是一种可行的方式。

但我也可以贡献一下,你的解决方案现在可以安装为“pip install webapp2_static”,从pipi ---由似乎正在使用他的真实姓名的作者......你可以肯定。其他webapp2文档,我发现有用的可用here

我执行Linux桌面开发服务器上的代码,用粘贴,你也用:

def main(): 
    from paste import httpserver 
    httpserver.serve(app, host='127.0.0.1', port='8080') 

但随着你拥有它上面的代码(这似乎是完全等同于webapp2_static.py文件),我没有发现把我的css文件放在应用程序根目录下名为static的文件夹中,就像你说的那样。

例如,我有/home/user/proj/public_html/app/app.py,其中py文件包含您的代码加上其他“视图”为我的超简单网站。 (我不知道如何粘贴真正的作品,所以也许现在的public_html只是在那里作为参考,以便我不会在将东西上传到生产服务器时感到困惑。)

因此,如果我把CSS样式表放到一个名为/ static的文件夹中,然后,如果我将/ static放入/ app或/ public_html的子目录中,我发现这两个位置都不起作用;我必须改为将它作为/ proj的子目录。

我并没有想到,但我的治疗方法是将app.configure.get(...,'static')调用中的默认'static'更改为'public_html/app/static' 。然后它可以在/ app /里面的/ static文件夹中运行。

同样使用带有'的pipi代码。/ app/static /代替默认的'static'不起作用;我发现我需要./public_html/app/static来代替(或者它可能只是/ public_html/app/static,甚至是public_html/app/static ...我忘了...其中一个工作)。

我测试了如何计算abs_path的工作方式,并在下面的代码中对其进行了重新编写,其中我已经删除了您的方法以支持更多的Djangoesque。要机智,在我的一个应用PY文件我把顶部的下列内容:

STATIC_DIR = os.sep + 'tostatic' + os.path.abspath(os.path.dirname(__file__)) + os.sep + 'static' 

然后在到我想补充的CSS页面,在我的情况,我的主页,我把一个非常可读的:

<link href="{{STATIC_DIR}}/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css"> 

对于产生我的主页我有“视图”(ENV是Jinja2的环境对象,它需要一个模板加载器作为参数):

class Home(webapp2.RequestHandler): 
    def get(self): 
     template = env.get_template('index.html') 
     template_values = {'STATIC_DIR': STATIC_DIR } 
     self.response.write(template.render(template_values)) 

最后的URL路由是在:

app = webapp2.WSGIApplication(
[ 
(r'/', Home), 
(r'/tostatic/(.+)', StaticView), 
], debug=True) 

的静态文件服务的观点,现在是:

class StaticView(webapp2.RequestHandler): 
    def get(self, path): 
     path = os.sep + path 
     try: 
      f = open(path, 'r') 
      self.response.headers.add_header('Content-Type', mimetypes.guess_type(path)[0]) 
      self.response.out.write(f.read()) 
      f.close() 
     except Exception, e: 
      print 'Problem in StaticView:', e 
      self.response.set_status(404) 

要终于接近,也就是我和你的方法的问题是一个,我和其他近菜鸟有网址的离开来自与文件系统的传统关联。在你的方法中,“static”既是一个子目录,也是URL前面斜线之间的一个字符串,它告诉解释器运行哪个视图(哪个webapp2.RequestHandler子类)。您从URL的其余部分获取/ static,然后再对其进行硬编码。当需要决定在标签中放入什么href时,HTML页面编码器必须记住这种重复性。通过{{STATIC_DIR}}模板变量方法,很明显该做什么。而且很容易重新定义静态文件的位置---只有STATIC_DIR声明必须改变。

我发现self.response.set_status(404)出现在Firebug中,但不是Firefox。很明显,在webapp2中,您必须提供并提供您自己的HTTP状态代码页。

0
self.response.headers.add_header('Content-Type', mimetypes.guess_type(abs_path)[0]) 
self.response.headers['Content-Type'] = mimetypes.guess_type(abs_path)[0] 
相关问题