2010-11-21 56 views
79

是否有任何聰明的解決方案將靜態文件存儲在Flask的應用程序根目錄中。 的robots.txt和sitemap.xml的預計/被發現,所以我的想法是爲他們創造路線:Flask中的靜態文件 - robot.txt,sitemap.xml(mod_wsgi)

@app.route('/sitemap.xml', methods=['GET']) 
def sitemap(): 
    response = make_response(open('sitemap.xml').read()) 
    response.headers["Content-type"] = "text/plain" 
    return response 

一定有什麼東西更方便:)

回答

60

最好的辦法是設置static_url_path到根URL

from flask import Flask 

app = Flask(__name__, static_folder='static', static_url_path='') 
+2

這是一個爲靜態文件工作的人, 謝謝。 +1 – 2014-06-09 01:16:47

+0

值得一提的是,static_folder不必位於項目文件夾中。例如static_folder ='/ app/ui'很好。 – ashic 2017-10-18 23:58:09

15

提供靜態文件無關與用於傳遞動態內容的應用程序有關。提供靜態文件的正確方式取決於您使用的服務器。畢竟,當您啓動並運行您的應用程序時,您需要將其綁定到Web服務器。我只能說Apache apache httpd,所以在虛擬主機中定義了服務靜態文件的方式,通過mod-wsgi綁定到您的應用程序。下面是指南會告訴你如何服務站點地圖,robots.txt或任何靜態內容: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

+0

這就是我一直在尋找的答案。謝謝! – biesiad 2010-11-22 15:29:34

+1

應用程序旨在提供內容,一些動態的和一些靜態的。 – 2017-04-06 21:55:53

65

@vonPetrushev是正確的,在生產中,你會希望通過nginx的IIS或Apache來提供靜態文件,但對於發展開發環境很簡單,讓您的python應用程序也可以提供靜態內容,這樣您就不必擔心更改配置和多個項目。爲此,您需要使用SharedDataMiddleware

from flask import Flask 
app = Flask(__name__) 
''' 
Your app setup and code 
''' 
if app.config['DEBUG']: 
    from werkzeug import SharedDataMiddleware 
    import os 
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { 
     '/': os.path.join(os.path.dirname(__file__), 'static') 
    }) 

本例假設您的靜態文件位於「靜態」文件夾中,根據您的環境進行調整。

+0

謝謝!這是我需要的!我期待爲我的製作heroku做到這一點。請參閱以下主題上的答案:http://flask.pocoo.org/mailinglist/archive/2012/2/22/flask-on-heroku-%2B-gunicorn-static-files/#20ff50d1dac06bf228b38d62ab11c6a9 – David 2012-03-29 22:45:34

+0

這是非常非常不錯的提示! – 2012-09-02 18:28:30

+2

擡頭 - 現在有一個更簡單的方法來處理這個問題。檢查我的回覆。 – 2013-01-17 23:00:06

3

從這裏的文件:http://flask.pocoo.org/docs/quickstart/#static-files

動態Web應用程序需要靜態 的文件。通常這裏的 的CSS和JavaScript文件都是來自 。理想情況下,您的web服務器 被配置爲爲您服務, ,但在開發期間,Flask也可以做 。只需在您的軟件包中創建一個文件夾 稱爲靜態文件,或者將 複製到您的模塊中,然後在 應用程序的/ static上創建一個文件夾 。

生成URL到 URL的一部分,使用特殊的 '靜態' 網址 名稱:

url_for( '靜', 文件名= 'style.css文件')

文件必須作爲static/style.css存儲在 文件系統中。

5

這可能已添加,因爲這個問題被問,但我一直在尋找通過燒瓶的「helpers.py」我發現flask.send_from_directory:

send_from_directory(directory, filename, **options) 
''' 
    send_from_directory(directory, filename, **options) 
    Send a file from a given directory with send_file. This 
    is a secure way to quickly expose static files from an upload folder 
    or something similar. 
''' 

...它引用flask.send_file :

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False) 

...這似乎更多的控制更好,雖然send_from_directory直接通過到由send_file通過**選項。

0

我也有同樣的困境。做了一些搜索,發現我的回答(MHO):

不妨從文檔

動態Web應用程序需要靜態文件,以及引用。這通常是CSS和JavaScript文件的來源。 理想情況下,您的Web服務器已配置爲爲您提供服務,但在開發期間,Flask也可以這樣做。只需在您的軟件包或模塊旁創建一個名爲static的文件夾,它將在應用程序的/ static處可用。

恕我直言:當你的應用程序是爲生產,靜態文件服務應該(或最好)的Web服務器(nginx的,阿帕奇)配置;但在開發期間,Flask使其可用於提供靜態文件。這是爲了幫助您快速發展 - 無需安裝網絡服務器等。

希望它有幫助。

13

另一種方式來發送靜態文件是使用這樣一個包羅萬象的規則:

@app.route('/<path:path>') 
def catch_all(path): 
    if not app.debug: 
     flask.abort(404) 
    try: 
     f = open(path) 
    except IOError, e: 
     flask.abort(404) 
     return 
    return f.read() 

我用這個來嘗試開發時最小化設置。我從http://flask.pocoo.org/snippets/57/

的想法。此外,我用我的單機上燒瓶但在生產服務器和Apache部署發展。我使用:

file_suffix_to_mimetype = { 
    '.css': 'text/css', 
    '.jpg': 'image/jpeg', 
    '.html': 'text/html', 
    '.ico': 'image/x-icon', 
    '.png': 'image/png', 
    '.js': 'application/javascript' 
} 
def static_file(path): 
    try: 
     f = open(path) 
    except IOError, e: 
     flask.abort(404) 
     return 
    root, ext = os.path.splitext(path) 
    if ext in file_suffix_to_mimetype: 
     return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext]) 
    return f.read() 

[...] 

if __name__ == '__main__': 
    parser = optparse.OptionParser() 
    parser.add_option('-d', '--debug', dest='debug', default=False, 
         help='turn on Flask debugging', action='store_true') 

    options, args = parser.parse_args() 

    if options.debug: 
     app.debug = True 
     # set up flask to serve static content 
     app.add_url_rule('/<path:path>', 'static_file', static_file) 
    app.run() 
+1

擡頭 - 現在有一個更簡單的方法來處理這個問題。檢查我的回覆。 – 2013-01-17 23:04:56

+0

如果您需要爲多個路徑提供服務,絕佳方式! – 2013-02-14 08:15:04

21

儘管這是一個老問題回答,我回答這個問題,因爲這個帖子出現相當高的谷歌的結果。雖然它沒有在文檔中涉及,但如果您閱讀Flask Application對象構造函數the API docs,則會覆蓋它。通過傳遞命名參數static_folder像這樣:

from flask import Flask 
app = Flask(__name__, 
      static_folder="/path/to/static", 
      template_folder="/path/to/templates") 

...您可以定義一個靜態文件是從服務。同樣,你可以定義一個template_folder,你static_url_path名稱。

+0

優秀!我猜靜態文件的路由仍然是/ static/.... – chmike 2013-01-19 09:08:53

+0

@chmike是的,它默認爲'/ static',但你可以通過重寫'static_url_path'來改變它。 – 2013-01-20 03:51:47

+0

這是正確的,但其他答案更靈活。這一點受限於它只能服務於一個目錄路徑的事實。 – 2013-02-14 08:14:37

53

最乾淨的這個問題的答案是answer這個(相同)question

from flask import Flask, request, send_from_directory 
app = Flask(__name__, static_folder='static')  

@app.route('/robots.txt') 
@app.route('/sitemap.xml') 
def static_from_root(): 
    return send_from_directory(app.static_folder, request.path[1:]) 

總結:

  • 大衛指出,用正確的配置它ok to serve a few static files through prod
  • 尋找/robots.txt不應導致重定向到/static/robots.txt。 (在Seans回答這讓您實現它不是立即清除)
  • 這是不乾淨的靜態文件添加到應用程序的根文件夾
  • 最後,所提出的解決方案看起來比加入中間件的方法更清潔:
相關問題