Yani bu utanç verici. Flask'ta bir araya getirdiğim bir uygulamam var ve şimdilik sadece CSS ve JS'ye bazı bağlantılar içeren tek bir statik HTML sayfası sunuyor. Ve Flask
dokümantasyonunda statik dosyaların döndürülmesinin nerede açıklandığını bulamıyorum. Evet, render_template
kullanabilirdim ama verilerin şablonlaştırılmadığını biliyorum. Doğru olanın send_file
veya url_for
olduğunu düşünmüştüm, ancak bunları çalıştıramadım. Bu arada, dosyaları açıyorum, içeriği okuyorum ve uygun mimetype ile bir Response
oluşturuyorum:
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: no cover
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path): # pragma: no cover
mimetypes = {
".css": "text/css",
".html": "text/html",
".js": "application/javascript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(path)[1]
mimetype = mimetypes.get(ext, "text/html")
content = get_file(complete_path)
return Response(content, mimetype=mimetype)
if __name__ == '__main__': # pragma: no cover
app.run(port=80)
Birisi bunun için bir kod örneği veya url vermek ister mi? Bunun çok basit olacağını biliyorum.
Tercih edilen yöntem, statik dosyaları sunmak için nginx veya başka bir web sunucusu kullanmaktır; bunu Flask'tan daha verimli bir şekilde yapabileceklerdir.
Ancak, dosyaları bir dizinden göndermek için send_from_directory
kullanabilirsiniz, bu da bazı durumlarda oldukça kullanışlı olabilir:
from flask import Flask, request, send_from_directory
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')
@app.route('/js/<path:path>')
def send_js(path):
return send_from_directory('js', path)
if __name__ == "__main__":
app.run()
Kullanıcı tarafından sağlanan bir yol ile send_file
veya send_static_file
kullanmayın.
send_static_file` örneği:
from flask import Flask, request
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')
@app.route('/')
def root():
return app.send_static_file('index.html')
İhtiyacınız olanı orada bulacağınızdan eminim: http://flask.pocoo.org/docs/quickstart/#static-files
Temel olarak paketinizin kökünde bir "static" klasörüne ihtiyacınız vardır ve ardından url_for('static', filename='foo.bar')
kullanabilir veya http://example.com/static/foo.bar ile dosyalarınıza doğrudan bağlantı verebilirsiniz.
EDIT: Yorumlarda önerildiği gibi doğrudan '/static/foo.bar'
URL yolunu kullanabilirsiniz FAKAT url_for()
ek yükü (performans açısından) oldukça düşüktür ve bunu kullanmak, daha sonra davranışı kolayca özelleştirebileceğiniz anlamına gelir (klasörü değiştirin, URL yolunu değiştirin, statik dosyalarınızı S3'e taşıyın, vb.)
Benim kullandığım (ve harika çalışan) bir "templates" dizini ve bir "static" dizinidir. Tüm .html dosyalarımı/Flask şablonlarımı templates dizinine yerleştiriyorum ve static CSS/JS içeriyor. render_template, Flask'ın şablon oluşturma sözdizimini ne ölçüde kullandığınızdan bağımsız olarak, bildiğim kadarıyla genel html dosyaları için iyi çalışıyor. Aşağıda views.py dosyamdaki örnek bir çağrı var.
@app.route('/projects')
def projects():
return render_template("projects.html", title = 'Projects')
Ayrı bir statik dizindeki statik bir dosyaya başvurmak istediğinizde url_for() kullandığınızdan emin olun. Muhtemelen html'deki CSS/JS dosya bağlantılarınızda bunu zaten yapacaksınız. Örneğin...
<script src="{{ url_for('static', filename='styles/dist/js/bootstrap.js') }}"></script>
Burada "canonical" gayri resmi Flask eğitimine bir bağlantı var - burada koşmaya başlamanıza yardımcı olacak birçok harika ipucu var.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world