Sanic如何定位到静态文件
Sanic how to locate to static file
我想定位到静态文件,因为html里面有很多相对路径,比如:
<a href="1.html"> page1 </a>
<a href="2.html"> page2 </a>
....
我可以在flask中使用app.send_static_file()
来制作它。
from flask import Flask
app = Flask(__name__, static_url_path='')
@app.route('/')
def index():
return app.send_static_file('index.html')
if __name__ == '__main__':
app.run(host="0.0.0.0",debug=True,port=8888)
但是对于Sanic我没有找到相关的方法
from sanic import Sanic
app = Sanic(__name__)
app.static('/static', './static')
@app.route('/')
async def index(request):
#return "static/index.html" file with static state.
if __name__=='__main__':
app.run(host='0.0.0.0',port=8888,debug=True, auto_reload=True)
有什么办法可以实现吗?或者sanic-jinja2、sanic-mako等方法也可以。
我有点不清楚确切地你想要做什么,所以我将提供几个可能是你正在寻找的例子。如果这能解决或不能解决问题,请告诉我,我可以修改答案。
静态文件
如果您想要提供单个静态文件(这也适用于静态文件目录),那么您可以使用 app.static
app.static("/static", "/path/to/directory")
# So, now a file like `/path/to/directory/foo.jpg`
# is available at http://example.com/static/foo.jpg
这也适用于 /path/to/directory
中的深层嵌套文件。
您也可以选择在单个文件上使用此模式,通常对 index.html
有帮助,例如:
app.static("/", "/path/to/index.html")
检索(或查找)URL 静态文件
如果“定位”一个文件意味着您想要访问它的 URL,那么您将使用 app.url_for
app.static(
"/user/uploads",
"/path/to/uploads",
name="uploads",
)
app.url_for(
"static", # Note, for any file registered with app.static, this value is "static"
name="uploads",
filename="image.png",
)
从路由处理程序提供文件
另一方面,如果您有一个常规路由处理程序并希望使用文件进行响应(这意味着您要做的不仅仅是提供静态文件),那么您可以使用 sanic.response.file
.
让我们想象一下您需要查找用户并获取他们的个人资料图片的场景:
@app.get("/current-user/avatar")
async def serve_user_avatar(request: Request):
user = await fetch_user_from_request(request)
return await file(user.avatar)
模板化
既然你提到了 jinja 和 mako,Sanic Extensions 是一个官方支持的添加模板的插件:
pip install "sanic[ext]"
@app.get("/")
@app.ext.template("foo.html")
async def handler(request: Request):
return {"seq": ["one", "two"]}
See this PR for alternative methods of serving templates with a render
function
回顾你的例子...
您的示例表明:
app.static('/static', './static')
@app.route('/')
async def index(request):
#return "static/index.html" file with static state.
对我来说,您似乎在 ./static/index.html
中有一个文件,您只想提供该文件。在这种情况下,@app.route
定义是不必要的,因为根据您的 app.static
定义它将成为服务器。如果您有这样的文件夹结构:
./root
├── static
│ └── index.html
└── server.py
那么你只需要:
app.static("/static", "./static")
我想定位到静态文件,因为html里面有很多相对路径,比如:
<a href="1.html"> page1 </a>
<a href="2.html"> page2 </a>
....
我可以在flask中使用app.send_static_file()
来制作它。
from flask import Flask
app = Flask(__name__, static_url_path='')
@app.route('/')
def index():
return app.send_static_file('index.html')
if __name__ == '__main__':
app.run(host="0.0.0.0",debug=True,port=8888)
但是对于Sanic我没有找到相关的方法
from sanic import Sanic
app = Sanic(__name__)
app.static('/static', './static')
@app.route('/')
async def index(request):
#return "static/index.html" file with static state.
if __name__=='__main__':
app.run(host='0.0.0.0',port=8888,debug=True, auto_reload=True)
有什么办法可以实现吗?或者sanic-jinja2、sanic-mako等方法也可以。
我有点不清楚确切地你想要做什么,所以我将提供几个可能是你正在寻找的例子。如果这能解决或不能解决问题,请告诉我,我可以修改答案。
静态文件
如果您想要提供单个静态文件(这也适用于静态文件目录),那么您可以使用 app.static
app.static("/static", "/path/to/directory")
# So, now a file like `/path/to/directory/foo.jpg`
# is available at http://example.com/static/foo.jpg
这也适用于 /path/to/directory
中的深层嵌套文件。
您也可以选择在单个文件上使用此模式,通常对 index.html
有帮助,例如:
app.static("/", "/path/to/index.html")
检索(或查找)URL 静态文件
如果“定位”一个文件意味着您想要访问它的 URL,那么您将使用 app.url_for
app.static(
"/user/uploads",
"/path/to/uploads",
name="uploads",
)
app.url_for(
"static", # Note, for any file registered with app.static, this value is "static"
name="uploads",
filename="image.png",
)
从路由处理程序提供文件
另一方面,如果您有一个常规路由处理程序并希望使用文件进行响应(这意味着您要做的不仅仅是提供静态文件),那么您可以使用 sanic.response.file
.
让我们想象一下您需要查找用户并获取他们的个人资料图片的场景:
@app.get("/current-user/avatar")
async def serve_user_avatar(request: Request):
user = await fetch_user_from_request(request)
return await file(user.avatar)
模板化
既然你提到了 jinja 和 mako,Sanic Extensions 是一个官方支持的添加模板的插件:
pip install "sanic[ext]"
@app.get("/")
@app.ext.template("foo.html")
async def handler(request: Request):
return {"seq": ["one", "two"]}
See this PR for alternative methods of serving templates with a render
function
回顾你的例子...
您的示例表明:
app.static('/static', './static')
@app.route('/')
async def index(request):
#return "static/index.html" file with static state.
对我来说,您似乎在 ./static/index.html
中有一个文件,您只想提供该文件。在这种情况下,@app.route
定义是不必要的,因为根据您的 app.static
定义它将成为服务器。如果您有这样的文件夹结构:
./root
├── static
│ └── index.html
└── server.py
那么你只需要:
app.static("/static", "./static")