Flask:request.view_args 总是返回一个空的字典 [重复]

Posted

技术标签:

【中文标题】Flask:request.view_args 总是返回一个空的字典 [重复]【英文标题】:Flask: request.view_args always returns an empty dicitonary [duplicate] 【发布时间】:2018-11-21 12:56:36 【问题描述】:

我正在尝试使用 Flask 附带的paginate() 函数对我的产品目录进行分页。

在目录内我使用搜索过滤器对产品进行排序取决于过滤器本身,在 url 我有超过 5 到 10 个参数,这些参数总是在变化,我想要分页 包含它们的路径。

在模板里面我这样做:

% if pagination.has_next or pagination.has_prev %
 
    macros.pagination_widget(
        pagination,
        request.endpoint,
        args=request.view_args
    )

% endif %

问题是,request.view_args 总是返回一个空字典,实际上参数在 url 中。

如果我尝试只使用一些我不想使用的逻辑(如 % if %% else %)对所有参数进行硬编码,则分页工作正常。

【问题讨论】:

你的观点是否定义了这些论点? @Mekicha 不,它没有,我有吗?我的意思是我可以从request.args 获取参数,例如,无需在我的视图中定义它们! request.args 访问解析后的 URL 参数(URL 中问号后的部分)。 view_args is 与请求匹配的视图参数的字典,例如,如果您有一个使用 user_id 变量的视图函数,如下所示:def get_user(user_id) 哦,我明白了,所以 request.view_args 工作只是在您将一些参数传递给您的视图时。 【参考方案1】:

我通过使用request.query_string 并创建了一个帮助程序解决了这个问题,现在一切正常。

解决办法如下:

_macros_pagination.html

% macro pagination_widget(pagination, endpoint, extra='') %
    <ul class="uk-pagination uk-flex-center" uk-margin="">
        <li% if not pagination.has_prev % class="disabled"% endif %>
            <a href="% if pagination.has_prev % url_for(endpoint, page=pagination.prev_num, **kwargs) &extra% else %#% endif %">
                <span uk-pagination-previous=""></span>
            </a>
        </li>
        % for p in pagination.iter_pages() %
            % if p %
                % if p == pagination.page %
                <li class="uk-active">
                    <a href=" url_for(endpoint, page = p, **kwargs) &extra"> p </a>
                </li>
                % else %
                <li>
                    <a href=" url_for(endpoint, page = p, **kwargs) &extra"> p </a>
                </li>
                % endif %
            % else %
            <li class="uk-disabled"><span>...</span></li>
            % endif %
        % endfor %
        <li% if not pagination.has_next % class="disabled"% endif %>
            <a href="% if pagination.has_next % url_for(endpoint, page=pagination.next_num, **kwargs) &extra% else %#% endif %">
                <span uk-pagination-next=""></span>
            </a>
        </li>
    </ul>
% endmacro %

template.html

% import "_macros_pagination.html" as macros %

% if pagination.has_next or pagination.has_prev %
     
        macros.pagination_widget(
            pagination,
            request.endpoint,
            extra=request.query_string
        )
    
% endif %

【讨论】:

以上是关于Flask:request.view_args 总是返回一个空的字典 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Flask 蓝图进行路由分发

Flask系列

用尽洪荒之力学习Flask源码

1.4 flask request和session

如何在多线程模式下使用 Gunicorn 运行 Flask

Flask模块化开发之蓝图