在 Django 中将文件路径作为 URL 参数传递

Posted

技术标签:

【中文标题】在 Django 中将文件路径作为 URL 参数传递【英文标题】:Pass a file path as a URL parameter in Django 【发布时间】:2020-07-27 13:23:26 【问题描述】:

我正在使用 Django 创建一个 webapp。当用户按下某个按钮时,它需要将文件路径作为参数和字符串参数传递给我的一个视图。我不能简单地使用 URL 中的参数,因为路径包含多个“/”。我现在的设置方式如下:

parameters.py

class FilePathConverter:
regex = '^[/]'

def to_python(self, value):
    value=str(value)
    return value.replace("?", "/")

def to_url(self, value):
    value=str(value)
    return value.replace("/", "?")

urls.py

from django.urls import path
from . import views
from django.contrib import admin
from django.views import generic
from django.urls import path, register_converter
from . import converters, views

register_converter(converters.FilePathConverter, 'filepath')

urlpatterns = [
   path('', views.index, name='webpanel-index'),
   path('controlserver/<filepath:server_path>/<str:control>', views.index, name='controlserver'),
]

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Server
from django.contrib.auth.decorators import login_required
import subprocess

def controlserver(request, server_path, control):
    if request.POST:
        subprocess.call(['bash', server_path, control])
    return render(request, 'index.html')

但是,使用这种方法,我得到了这个错误:

Reverse for 'controlserver' with keyword arguments ''server_path': 'rien/', 'control': 'start'' not found. 1 pattern(s) tried: ['controlserver/(?P<server_path>[^/]+)/(?P<control>[^/]+)$']

【问题讨论】:

如果你想在路径上操作你应该熟悉pathlib。这是一种将字符串作为 Path 对象处理并使用内置方法修改它们的快速方法。如果您发现此评论有帮助,请不要忘记点赞 :) 如果您需要更多帮助,请询问但首先阅读开头链接的 pathlib 文档 看起来您正在尝试反转 controlserver url,但您将 server_path 的值作为 rien/。这永远不会匹配 str 值,因为它不能包含 / 尝试为您的转换器使用正则表达式[^/]+。这与 django 用于 str 匹配的相同,如果我理解正确的话,它应该与你的文件路径相同。 【参考方案1】:

您可以使用 Slug 通过以下方式解决此模式:


从 django.utils.text 导入 slugify

path('controlserver/use slug .....', views.index, name='controlserver'),

但是你需要把 slug 放在视图和模板中所以检查这个 slug 和 pk 列表:

https://github.com/salah-cpu/migration/blob/master/PATH_slug_pk

【讨论】:

以上是关于在 Django 中将文件路径作为 URL 参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django urls.py 中将 url 参数传递给 reverse_lazy

在 Django Urls 中将 URL 作为参数传递

如何在 django 2 中将 url 中的 # 作为参数传递

怎么在django中获取URL上的参数

在 Django 中将参数传递给 websocket

使用HTTP协议向服务器传参的方式及django中获取参数的方式