为什么 url_for() 使用 'static' 作为第一个参数?没有静态()
Why does url_for() works with 'static' as first parameter? There's no static()
不明白为什么它会起作用,所以我无法更改它:
我在表单中使用 Flask-Admin 的 ImageUploadField
,字段是这样的:
image = ImageUploadField(label='Optional image',
base_path=app.config['UPLOAD_FOLDER'],
relative_path=op.relpath(app.config['UPLOAD_FOLDER']),
endpoint='static'
)
endpoint='static'
为默认值。
endpoint
在 flask_admin.ext.form.upload
中这样使用:
def get_url(self, field):
if field.thumbnail_size:
filename = field.thumbnail_fn(field.data)
else:
filename = field.data
if field.url_relative_path:
filename = urljoin(field.url_relative_path, filename)
return url_for(field.endpoint, filename=filename)
所以它被传递给一个 url_for()
函数...
url_for()
的结果只是将 'static/'
添加到文件名前。如果我尝试设置
endpoint='some_string'
当然会引发 BuildError
,但如果我尝试这样做:
#admin.py
class ProductForm(Form):
order = IntegerField('order')
name = TextField('name')
category = SelectField('category', choices=[])
image = ImageUploadField(label='Optional image',
base_path=app.config['UPLOAD_FOLDER'],
relative_path=op.relpath(app.config['UPLOAD_FOLDER']),
endpoint='dumb_f'
)
def dumb_f(str=''):
return str
它也提高了 BuildError
,我猜是因为 dumb_f()
在 upload.py
中不可见。
为什么 url_for()
还有效?第一个参数不应该是函数名吗?我没有 static
命名方法,upload.py
也没有。
Flask 为您提供static
端点。
请注意,我在那里使用了 endpoint 这个词; url_for()
函数采用端点名称,@app.route()
装饰器 默认 使用函数名称作为端点名称,但你绝不 需要使用函数名。
您的代码不是唯一可以注册路由和端点的地方。 Flask 应用程序在您创建它时根据默认配置简单地注册了 static
。
见Flask
class definition source code:
# register the static folder for the application. Do that even
# if the folder does not exist. First of all it might be created
# while the server is running (usually happens during development)
# but also because google appengine stores static files somewhere
# else when mapped with the .yml file.
if self.has_static_folder:
self.add_url_rule(self.static_url_path + '/<path:filename>',
endpoint='static',
view_func=self.send_static_file)
app.add_url_rule()
method 也注册了一个路由,Flask 在这里明确指定了 endpoint
参数。
如果您想从其他端点提供上传的图像,您必须自己注册一个。
不明白为什么它会起作用,所以我无法更改它:
我在表单中使用 Flask-Admin 的 ImageUploadField
,字段是这样的:
image = ImageUploadField(label='Optional image',
base_path=app.config['UPLOAD_FOLDER'],
relative_path=op.relpath(app.config['UPLOAD_FOLDER']),
endpoint='static'
)
endpoint='static'
为默认值。
endpoint
在 flask_admin.ext.form.upload
中这样使用:
def get_url(self, field):
if field.thumbnail_size:
filename = field.thumbnail_fn(field.data)
else:
filename = field.data
if field.url_relative_path:
filename = urljoin(field.url_relative_path, filename)
return url_for(field.endpoint, filename=filename)
所以它被传递给一个 url_for()
函数...
url_for()
的结果只是将 'static/'
添加到文件名前。如果我尝试设置
endpoint='some_string'
当然会引发 BuildError
,但如果我尝试这样做:
#admin.py
class ProductForm(Form):
order = IntegerField('order')
name = TextField('name')
category = SelectField('category', choices=[])
image = ImageUploadField(label='Optional image',
base_path=app.config['UPLOAD_FOLDER'],
relative_path=op.relpath(app.config['UPLOAD_FOLDER']),
endpoint='dumb_f'
)
def dumb_f(str=''):
return str
它也提高了 BuildError
,我猜是因为 dumb_f()
在 upload.py
中不可见。
为什么 url_for()
还有效?第一个参数不应该是函数名吗?我没有 static
命名方法,upload.py
也没有。
Flask 为您提供static
端点。
请注意,我在那里使用了 endpoint 这个词; url_for()
函数采用端点名称,@app.route()
装饰器 默认 使用函数名称作为端点名称,但你绝不 需要使用函数名。
您的代码不是唯一可以注册路由和端点的地方。 Flask 应用程序在您创建它时根据默认配置简单地注册了 static
。
见Flask
class definition source code:
# register the static folder for the application. Do that even
# if the folder does not exist. First of all it might be created
# while the server is running (usually happens during development)
# but also because google appengine stores static files somewhere
# else when mapped with the .yml file.
if self.has_static_folder:
self.add_url_rule(self.static_url_path + '/<path:filename>',
endpoint='static',
view_func=self.send_static_file)
app.add_url_rule()
method 也注册了一个路由,Flask 在这里明确指定了 endpoint
参数。
如果您想从其他端点提供上传的图像,您必须自己注册一个。