-->

服务与webapp2的样式谷歌应用程序引擎之外(Serve stylesheet with weba

2019-06-25 07:32发布

所以,我已经成功地部署使用webapp2的/ Jinja2的和粘贴服务器一个应用程序,但我有提供静态样式表的麻烦。

我有运气通过访问静态文件, 这种方法 ,以及实施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

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

Answer 1:

你不需要一个静态文件处理程序。
加入给你的上传与静态文件夹中的应用程序app.yaml

- url: /static/
  static_dir: static

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

编辑:请参阅下面的回答评论



Answer 2:

@Mnemon,戴的帽子给你解决我的问题。 我会给予好评你,但我不能这样做。 你相信我,如果它不是没有GAE的唯一webapp2的方式,它至少一种方式,将工作。

而且我的专长,你的解决方案现已安装的“PIP安装webapp2_static”,从皮皮 ---由作家谁好像是用自己的真实姓名......你,我敢肯定。 我发现有用的其他webapp2的文档都可以在这里 。

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

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

但随着你拥有它上面(这似乎是完全等同于webapp2_static.py文件)的代码,我没有发现,把我的css文件名为在应用程序根的作品静态照你说的文件夹中。

例如,我有/home/user/proj/public_html/app/app.py,其中PY文件包含代码加上其他的“意见”为我的超简单的网站。 (我不知道怎么贴真正起作用的,所以也许对于现在的public_html只是在那里供参考,这样,当我上传的东西到生产服务器我不会混淆。)

所以,如果我把CSS样式表到一个名为/静态的,那么,如果我把/静中无论是作为/应用程序的子目录中的文件夹或/的public_html的我发现,无论是位置工作; 我必须改为使它/凸出的子目录。

我没想到的是,但治疗对我来说是更改默认的“静态”在你app.configure.get(...,“静”)的调用,为“的public_html /应用/静态”。 然后,它的工作原理,带/应用程序里面的/静态的文件夹中。

同样使用与皮皮代码” ./app/static/取代默认的‘静态’不工作; 我发现我需要./public_html/app/static而不是(或者也许这只是/的public_html /应用/静态甚至的public_html /应用/静态的......我忘了......其中的一个工作)。

我测试你的绝对路径的作品如何计算并在下面的代码,在我所junked你的做法有利于更多的东西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)

为了终于接近,也就是我和你的方法的问题是一个,我等菜鸟附近有网址从文件系统中遗留的关联出发。 在你的方法“静态”既是一个子目录,并在该通知(webapp2.RequestHandler子类)来运行其观点解释的URL的前斜线之间的字符串。 你从URL的其余部分/静态再后来回到硬编码。 当谈到时间来决定要放什么东西在HREF标记中的HTML页面编码器必须记住,口是心非。 随着{{STATIC_DIR}}模板变量的做法很明显的事。 而且很容易重新定义静态文件的位置---只有STATIC_DIR声明必须改变。

我发现,self.response.set_status(404)在Firebug显示出来,而不是Firefox浏览器。 显然与webapp2的,你必须提供并服务于自己的HTTP状态代码页。



Answer 3:

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


文章来源: Serve stylesheet with webapp2 outside of Google App Engine