Django:重定向,如果url是由用户手动编写的

时间:2018-05-08 09:11:06

标签: javascript html django redirect django-views

是否可以限制用户手动填写页面的网址?

假设我有两个页面 - somepage.com/home和someplace.com/other以及主页中的某个位置是将用户重定向到/其他网站的按钮。我想确保用户无法通过手动编写其URL来访问/其他。相反,它应该重定向回主页。

我可以使用像login_required这样的装饰器吗?或者也许我应该使用一些js函数?

提前感谢任何提示,欢呼。

2 个答案:

答案 0 :(得分:0)

尝试使用html的referrer属性,如果用户通过单击主页中的链接转到其他页面,则引用并指向您的主页。但是,如果用户手动输入了其他页面链接,则引荐来源不会指向您的主页。

  

返回值:一个String,表示加载当前文档的文档的URL。返回整个URL,包括协议(如http://)。如果当前文档未通过链接打开(例如,通过书签),则返回空字符串。

参考:https://www.w3schools.com/jsref/prop_doc_referrer.asp

其他,效率不高的解决方案:

  1. 您不需要登录功能吗?如果您需要,那么只需继续并实现一个并将其他视图标记为login_required。 如果您不需要,请阅读第2点。

    1. 您可以从主页按钮发布一些随机唯一值以转到其他页面。在其他视图中检查该值。如果未找到该值,则重定向到主页。如果找到,则显示其他视图。 如果用户通过输入URL访问页面,则该值将缺少那些重定向到主页的值。有一点需要注意,这个解决方案并不安全。如果您没有实施足够安全,用户可以欺骗服务器。

答案 1 :(得分:0)

您可以构建一个middeware并使用它。 首先,您需要为每个用户分配一个组或访问user.i使用user_type执行此操作。 现在,您创建文件acl并创建一个URL名称包。

<强> acl.py

    acl_view_segment_divided = {
        "pack_1": [
            "url_name_1",
            "url_name_2",
            .
            .
            .
        ],
        "pack_2": [
            "url_name_3",
            "url_name_4",
            .
            .
            .
        ],
    }

    acl_view_segment = dict(
        user_type_1=list(
            acl_view_segment_divided["pack_1"] +
            acl_view_segment_divided["pack_2"]
        ),
        user_type_2=list(
            acl_view_segment_divided["pack_1"] 
        ),
    )

现在您需要创建middelware文件:

<强> middleware.py

from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
from django.core.urlresolvers import resolve
from acl import acl_view_segment
from django.shortcuts import render
from django.contrib import auth

from apps.main.views import page_permission_denied_view


class ACLMiddleware(MiddlewareMixin):
    @staticmethod
    def process_view(request, view_func, view_args, view_kwargs):
        if not request.user.is_authenticated():
            return

        current_url = resolve(request.path_info).url_name

        if current_url in getattr(settings, 'ACL_EXEMPT_VIEWS', set()):
            return

        user_type = request.user.user_type

        acl = acl_view_segment[user_type]

        if current_url not in acl:
            return page_permission_denied_view(request)
            or
            return redirect(home_page)

将middelware添加到setting.py

<强> settings.py

MIDDLEWARE = [
    ...
    'yourproject.middleware.ACLMiddleware',
]

如果您有任何疑问,请在评论中提问。我希望您的问题得到解决。