为什么url_for()适用于'静态'作为第一个参数?没有静态()

时间:2015-03-06 11:45:21

标签: python flask flask-admin url-for

无法理解它为什么会起作用,所以我无法改变它:

我在表单中使用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'是默认值。

endpointflask_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也没有。

1 个答案:

答案 0 :(得分:4)

Flask为您提供static 端点

请注意,我在那里使用了 endpoint 这个词; url_for()函数采用端点名称,@app.route()装饰器默认使用函数名称作为端点名称,但您绝不是 required 使用函数名。

您的代码不是唯一可以注册路由和终端的地方。根据默认配置,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参数。

如果您想从其他端点提供上传的图像,则必须自行注册。