Python / Django中的个性化/随机URL

时间:2015-04-09 18:51:37

标签: python html django url random

我是Python初学者(顺便说一句,也是英语初学者)。 我刚刚在Python / Django中创建了一个创建,编辑和删除项目的简单表单。 我有HTML链接,引用我的网址,如:

FILE.HTML:

<INPUT Type="BUTTON" VALUE="Edit" ONCLICK="window.location.href='/edit/{{ object.id }}/'">

URLS.PY:

url(r'^edit/(?P<id>\d+)/$', 'app.views.editobj'),

VIEWS.PY:

def editobj(request, id):

但是,当然,有一个问题,我不希望人们直接在URL上(只有点击按钮),因为有人可以只输入URL:/ removeobj / 1并删除对象ID = 1。我想要做的是创建不同的URL,也许是随机的,因此用户永远不会猜到按钮将打开的URL是什么,当然,它确实可以使用ID参数,所以当它是goind to edit /删除,打开正确的对象。 我希望我能清楚自己的需求。感谢。

2 个答案:

答案 0 :(得分:1)

生成随机URL会非常低效,更不用说实施起来不必要了。做你要问的常用方法是POST到URL。我认为你应该多阅读一下Django POSTing,因为它可以帮助你更好地理解它的作用。无论如何,这是一个使用它的例子:

urls.py

url(r'^delete/$', 'app.views.delete_object', name="delete_obj"),

views.py

def delete_object(request):
""" Get the ID of an object via POST, then delete it. """
    if request.method == 'POST'  # This makes sure the request is a POST
        obj_id = request.POST['obj_id']
        obj = MODELNAME.objects.get(id=obj_id)  # Use your model name here

        # You can use if conditions here to make sure the object you just
        # retrieved is allowed to be deleted by this user, or in general.

        obj.delete()

        messages.success(request, 'Object successfully deleted!')
    return redirect(reverse('index'))  # Make sure you use a name that exists

html的

<form method="POST" action="{% url 'delete_obj' %}">
    {% CSRF_TOKEN %}
    <input type="hidden" value="{{ obj.id }}" name="obj_id" />
    <button type="submit">Submit</submit>
</form>

您可以在views.py中使用更多逻辑来确保允许该对象是可删除的,但是在大多数情况下,我编写的代码应该让您对创建POST的方式有所了解 - &GT;删除对象工作流程请随意在我的答案下面的评论部分提问。

答案 1 :(得分:0)

我看到做“随机”网址的最简单方法是为您的模型添加一个UUIDField(https://docs.djangoproject.com/en/1.8/ref/models/fields/#uuidfieldhttps://github.com/dcramer/django-uuidfield用于Django&lt; 1.8)。

您的网址可以成为

url(r'^delete/(?P<uuid>[\da-f-]+)', 'app.views.delete_object', name='delete_obj')

uuid几乎无法猜测。

现在,如果你没有添加额外的安全性来检查用户是否有来删除对象,那么任何人都可以运行一个机器人,它将遍历每一个可能的uuid并刷新你的数据库

如果只是一个不“猜测”的问题,@ Hybrid的解决方案可能是一个更好的起点。