With Flask, how can I serve robots.txt and sitemap.xml as static files? [duplicate]

ε祈祈猫儿з 提交于 2019-11-28 20:01:48

问题


This question already has an answer here:

  • Static files in Flask - robot.txt, sitemap.xml (mod_wsgi) 9 answers

I've read on quiet a few places that serving static files should be left to the server, for example in a couple of the answers on this SO question. But I use the OpenShift PaaS, and can't figure out how to modify the .htaccess file there.

I came across this piece of code that serves the sitemap from a template. I did that on my app for both the sitemap, and robots.txt, like so -

@app.route("/sitemap.xml")
def sitemap_xml():
    response= make_response(render_template("sitemap.xml"))
    response.headers['Content-Type'] = 'application/xml'
    return response

@app.route("/robots.txt")
def robots_txt():
    return render_template("robots.txt")

Is there any harm in this, or is my approach okay?


回答1:


Put robots.txt and sitemap.xml into your app's static directory and define this view:

from flask import Flask, request, send_from_directory

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



回答2:


Flask has built in support for serving static files.

Make a /static directory and put your files there. Then, when you instantiate Flask, specify the static_url_path parameter:

app = Flask(__name__, static_url_path='/')

The default is to serve static files from the /static/ path, but you want them served from / so they are where expected.

See the Flask API Docs for more info.

In addition to overhead and unnecessary code, the problem with your approach is if / when one of the files you want to serve contains something that looks like a template tag to render_template -- you can cause a rendering error. If you were to read the file into memory (once, not inside the method) then use that string as the body of the response without calling render_template, you would at least avoid that problem.




回答3:


The best way is to set static_url_path to root url

from flask import Flask

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


来源:https://stackoverflow.com/questions/14048779/with-flask-how-can-i-serve-robots-txt-and-sitemap-xml-as-static-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!