下载文件页面的 NoReverseMatch 错误

Posted

技术标签:

【中文标题】下载文件页面的 NoReverseMatch 错误【英文标题】:NoReverseMatch error for download file page 【发布时间】:2020-10-08 09:31:28 【问题描述】:

我正在开发一个 django 网络应用程序。在这里,当提交表单时,Web 应用程序会生成一个 pandas 数据框。此数据框存储在根目录中。我有另一个用于下载生成的 csv 文件的视图。但是当我重定向到下载页面时,我得到一个 No reverse match 错误。

这是我目前的代码

def randomfilename(stringLength=8):
    lettersAndDigits = string.ascii_letters + string.digits
    return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))

def generate_dataframe(request):
    if request.method == 'POST':
        ...
        df = pd.DataFrame(columns=cols)
        df['title'] = title_lst
        df['link'] = product_links[:1]

        fn = randomfilename()
        df.to_csv('./'+fn+'.csv')
        return redirect("download_file", filename = fn)

def download_file(request, filename):
    if request.method == 'POST':

        file_path = './'+filename

        file = open(file_path, 'r')
        mime_type, _ = mimetypes.guess_type(file_path)
        response = HttpResponse(file, content_type=mime_type)
        response['Content-Disposition'] = "attachment; filename=%s" % filename

        return response

项目 urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('scraper.urls')),
]

scraper urls.py

urlpatterns = [
    path('generate', views.generate_dataframe, name='generate_dataframe'),
    path('download/<filename>/', views.download_file, name='download_file'),
]

我知道我在某处弄乱了 URL。但我不确定如何纠正这个问题。请帮我。提前致谢。

【问题讨论】:

【参考方案1】:

试试这个:

在你看来

from django.urls import reverse

def generate_dataframe(request):
    ...
return redirect(reverse('download_file', kwargs='filename': fn))

在你的 urls.py 中:

urlpatterns = [
    ...
    path('download/<str:filename>/', views.download_file, name='download_file'),
]

在您的模板中:

% url 'download_file' filename %

【讨论】:

我仍然收到此错误Reverse for 'download_file' with no arguments not found. 1 pattern(s) tried: ['download/(?P&lt;filename&gt;[^/]+)/$'] 您的 urls.py 是在您的基础应用中还是在其他应用中? 项目只包含项目文件夹和app文件夹。项目中只有一个应用程序。应用名称是刮板。问题中的 URL 位于 app 文件夹中。我还编辑了问题以添加项目 URL。请看一下 在您的 urls.py 中在 urlsparterns app_name='scraper' 之前添加一个变量。然后在你看来,做:return redirect(reverse('scraper:download_file', kwargs='filename': fn)) 我试过了。它没有帮助。我为应用程序 URL 添加了另一个路径,例如 path('download/', views.download_file, name='download_file'),,这样当它是 get request 时,显示网页,当按下按钮时,下载文件。现在我得到一个不同的错误download_file() missing 1 required positional argument: 'filename' 。我做的对吗?

以上是关于下载文件页面的 NoReverseMatch 错误的主要内容,如果未能解决你的问题,请参考以下文章

按钮中的“NoReverseMatch”指的是在 url 中带有参数的页面

升级 Django 和 NoReverseMatch 密码错误

Django:NoReverseMatch 在

如何解决 django 中的 NoReverseMatch 错误 [重复]

django noreversematch 传递参数时出错

Django NoReverseMatch at / 路径名和/或顺序是不是冲突?