2012-06-07 51 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] 
相關問題