Python 瓶子静态文件
我已经试过阅读瓶子的文档,但是,我仍然不确定静态文件服务是如何工作的。我有一个Python 瓶子静态文件,python,python-2.7,bottle,Python,Python 2.7,Bottle,我已经试过阅读瓶子的文档,但是,我仍然不确定静态文件服务是如何工作的。我有一个index.tpl文件,其中附加了一个css文件,可以正常工作。然而,我读到瓶子不会自动提供css文件,如果页面加载正确,这是不可能的 但是,我在请求页面时遇到了速度问题。这是因为我没有使用返回静态文件(参数转到这里)?如果有人能弄清楚它们是如何工作的,以及加载页面时如何使用它们,那就太好了 服务器代码: from Bottle import route,run,template,request,static_file
index.tpl
文件,其中附加了一个css文件,可以正常工作。然而,我读到瓶子不会自动提供css文件,如果页面加载正确,这是不可能的
但是,我在请求页面时遇到了速度问题。这是因为我没有使用返回静态文件(参数转到这里)
?如果有人能弄清楚它们是如何工作的,以及加载页面时如何使用它们,那就太好了
服务器代码:
from Bottle import route,run,template,request,static_file
@route('/')
def home():
return template('Templates/index',name=request.environ.get('REMOTE_ADDR'))
run(host='Work-PC',port=9999,debug=True)
索引:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type"
content="text/html; charset=ISO-8859-1">
<title>index</title>
<link type="text/css"
href="cssfiles/mainpagecss.css"
rel="stylesheet">
</head>
<body>
<table
style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;"
border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td>
<h1><span class="headertext">
<center>Network
Website</center>
</span></h1>
</td>
</tr>
</tbody>
</table>
%if name!='none':
<p align="right">signed in as: {{name}}</p>
%else:
pass
%end
<br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2"
cellspacing="2">
<tbody>
<tr>
<td>
<table style="text-align: left; width: 100%;" border="0"
cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td style="width: 15%; vertical-align: top;">
<table style="text-align: left; width: 100%;" border="1"
cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td>Home<br>
<span class="important">Teamspeak Download</span><br>
<span class="important">Teamspeak Information</span></td>
</tr>
</tbody>
</table>
</td>
<td style="vertical-align: top;">
<table style="text-align: left; width: 100%;" border="1"
cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td>
<h1><span style="font-weight: bold;">Network Website</span></h1>
To find all of the needed information relating to the network's social
capabilities, please refer to the links in the side bar.</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>
指数
网络
网站
%如果名称!='“没有”:
以以下身份登录:{{name}
%其他:
通过
%结束
主页
Teamspeak下载
Teamspeak信息
网络网站
查找与网络社交网络相关的所有必要信息
功能,请参考侧栏中的链接。
如文档所示,您应该使用static函数提供静态文件,css是一个静态文件。静态函数处理安全性和其他一些可以从源代码中找到的函数。静态函数的path参数应该指向存储css文件的目录要使用瓶子
提供静态文件,您需要使用提供的静态文件
函数并添加一些额外的路由。以下路由引导静态文件请求,并确保仅访问具有正确文件扩展名的文件
from bottle import get, static_file
# Static Routes
@get("/static/css/<filepath:re:.*\.css>")
def css(filepath):
return static_file(filepath, root="static/css")
@get("/static/font/<filepath:re:.*\.(eot|otf|svg|ttf|woff|woff2?)>")
def font(filepath):
return static_file(filepath, root="static/font")
@get("/static/img/<filepath:re:.*\.(jpg|png|gif|ico|svg)>")
def img(filepath):
return static_file(filepath, root="static/img")
@get("/static/js/<filepath:re:.*\.js>")
def js(filepath):
return static_file(filepath, root="static/js")
我过去使用过Sanketh的模板,但随着时间的推移,它浓缩成了一个扩展不可知函数。您只需在ext_map dictionary中添加扩展文件夹映射。如果扩展未显式映射,则默认为static/folder
import os.path
# Static Routes
@get('/<filename>')
def serve_static_file(filename):
ext = os.path.splitext(filename)[1][1:]
ext_map = {'image':['png','gif','jpg','ico'],'js':['js']}
sub_folder = next((k for k, v in ext_map.items() if ext in v),'')
return static_file(filename, root='static/'+sub_folder)
导入操作系统路径
#静态路由
@获取(“/”)
def SERVER_静态_文件(文件名):
ext=os.path.splitext(文件名)[1][1:]
ext_map={'image':['png'、'gif'、'jpg'、'ico']、'js':['js']}
sub_folder=next((k代表k,v在ext_map.items()中,如果ext在v中),“”)
返回静态文件(文件名,root='static/'+子文件夹)
与Sanketh的回答中使用正则表达式匹配为文件提供服务不同,我不希望修改模板并显式提供静态文件的路径,如:
<script src="{{ get_url('static', filename='js/bootstrap.min.js') }}"></script>
:路径以非贪婪的方式匹配整个文件路径,这样您就不必担心在切换到生产环境时更改模板-只要将所有内容保持在相同的相对文件夹结构中即可。这里只是提供一个答案,因为我的许多学生在作业中使用了此代码,我对此有点怀疑关注解决方案
在瓶子中提供静态文件的标准方法是:
从瓶子导入静态文件
@路由(“/static/”)
def服务器_静态(文件路径):
返回静态_文件(filepath,root='/path/to/your/static/files')
这样,静态文件夹下的所有文件都从以/static开头的URL提供。在HTML中,您需要引用资源的完整URL路径,例如:
Sanketh的回答是,URL空间中任何地方对图像、css文件等的任何引用都是从静态文件夹中的给定文件夹提供的。因此/foo/bar/baz/picture.jpg和/picture.jpg都将从static/images/picture.jpg提供。这意味着您不必担心在HTML代码中获得正确的路径,您可以始终使用相对文件名(即just src=“picture.jpg”)
当您尝试部署应用程序时,这种方法会出现问题。在生产环境中,您希望静态资源由像nginx这样的web服务器服务,而不是由应用程序服务。为了实现这一点,它们都应该从URL空间的单个部分提供服务,例如/static。如果您的代码中充斥着相关的文件名,那么它将很难转换为这个模型
因此,我建议使用瓶子教程中的三行解决方案,而不是本页列出的更复杂的解决方案。它的代码更简单(因此不太可能出现错误),并且允许您无缝地迁移到生产环境,而无需更改代码 我对瓶子不太了解,但说它不提供静态文件的说法可能只适用于生产模式,而不适用于开发。让您的Apache或您正在使用的任何东西服务于静态文件通常会更有效。顺便说一下。。。HTML中的表太多;)那么我应该如何设置它来使用我的模板呢?或者这只是在部署到生产服务器而不是开发服务器时发生的?瓶子有一个名为TEMPLATE_PATH的变量,它是瓶子搜索模板的路径列表。选中瓶子.py源文件中的第2839行。您可以使用其中一个默认路径,也可以将您正在使用的路径添加到该列表中。因此,如果我将模板路径添加到该变量中,请使用返回静态文件(pathtomycss)
我应该这样做吗?如果没有,你能给我举个例子吗?对于所有这些问题,我很抱歉,我只是从web developing x.xNo.开始。您可以将html模板文件的路径添加到模板路径中,但是css文件通常包含在不同的文件夹中。您将该文件夹的路径传递给static_file函数。那么我有两个返回函数?模板和静态文件?包含#静态路由的模块的名称是什么<
import os.path
# Static Routes
@get('/<filename>')
def serve_static_file(filename):
ext = os.path.splitext(filename)[1][1:]
ext_map = {'image':['png','gif','jpg','ico'],'js':['js']}
sub_folder = next((k for k, v in ext_map.items() if ext in v),'')
return static_file(filename, root='static/'+sub_folder)
<script src="{{ get_url('static', filename='js/bootstrap.min.js') }}"></script>
@app.route('/static/<filename:path>', name='static')
def serve_static(filename):
return static_file(filename, root=config.STATIC_PATH)
from bottle import static_file
@route('/static/<filepath:path>')
def server_static(filepath):
return static_file(filepath, root='/path/to/your/static/files')