小编Ger*_*dJP的帖子

Django:使用@login_required并设置LOGIN_URL时出现信息泄漏问题

当使用@login_required装饰器并设置LOGIN_URL变量时,我发现了一种信息泄漏.

我有一个网站,要求所有内容的强制登录.问题是,当它是现有页面时,您将被重定向到登录页面,并设置下一个变量.

所以当没有登录并要求:

 http://localhost:8000/validurl/
Run Code Online (Sandbox Code Playgroud)

你看到了这个:

 http://localhost:8000/login/?next=/validurl/
Run Code Online (Sandbox Code Playgroud)

在请求不存在的页面时:

 http://localhost:8000/faultyurl/
Run Code Online (Sandbox Code Playgroud)

你看到了这个:

 http://localhost:8000/login/
Run Code Online (Sandbox Code Playgroud)

这揭示了一些我不想要的信息.我想过覆盖login方法,强制下一个为空并在这个子类方法上调用'super'.

另一个问题是我的一些测试在没有设置LOGIN_URL的情况下失败.他们重定向到'/ accounts/login /'而不是'/ login /'.因此,为什么我想使用LOGIN_URL但禁用'自动下一个'功能.

谁可以对这个问题有所了解?

非常感谢.

杰拉德.

python authentication django django-urls

10
推荐指数
1
解决办法
709
查看次数

Django自定义handler404显示404,但给出标题200

我为经过身份验证的Django网站制作了一个自定义handler404,以避免信息泄露.

def check_logged_in_404(request):
    """ Custom 404. Show friendly 404 when logged in and redirect to /login
    when not logged in.
    """
    if request.user.is_authenticated():
        return render_to_response('404.html')
    else:
        return HttpResponseRedirect('/login')
Run Code Online (Sandbox Code Playgroud)

在功能上它完全符合我的要求.但是,404返回页面的状态为200,这是正确的代码方式.但这显然需要成为404返回状态.

raise404不起作用,因为如果不以无限递归结束,它会返回到此处,从而导致相同的问题.

我尝试了一个HttpResponseNotFound,但这只是一个字符串作为参数而不是模板,这不是DRY-ish.

我手动尝试设置标题:

    response = render_to_response('404.html')
    response['Status'] = "Not Found - 404"
    return response
Run Code Online (Sandbox Code Playgroud)

然后确实设置了状态标题,但浏览器仍然显示200.

我没有选择..任何有提示的人,请成为我的英雄...... :)

Thanx和问候,

杰拉德.

编辑:我尝试了所有排序btw状态字段值,但没有运气:(

django http-status-code-404

8
推荐指数
3
解决办法
9421
查看次数

Django sys.path.append用于WSGI下的project*和*app

有人可以给我一个指针,说明为什么我需要将我的项目根路径添加到python路径以及我的WSGI文件中的应用程序本身?

项目基础称为"djapp",该应用程序称为"myapp".

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../djapp')

os.environ['DJANGO_SETTINGS_MODULE'] = 'djapp.settings'
Run Code Online (Sandbox Code Playgroud)

如果我省略了带有"/../djapp/"的行,则日志会告诉我'myapp'无法导入,即使'djapp.settings'是.(验证'djapp'已导入)

它可以使用./manage.py命令正常运行.__init__项目文件夹中有一个.

为了测试,我看到同样的问题使用addsitedir:

site.addsitedir('/home/user/web/project/')
site.addsitedir('/home/user/web/project/djapp')
Run Code Online (Sandbox Code Playgroud)

django django-wsgi

6
推荐指数
1
解决办法
8653
查看次数

为什么 Celery 只运行链中的第一个任务?

我有一个工作链,但是当我添加apply_async()它时,它只执行第一个任务。

@task(name='run_a', delay=True)
def run_a(**kwargs):
    do_whatever(kwarg['var'])
    return

@task(name='run_b', delay=True)
def run_b(**kwargs):
    # ...
    return

@task(name='run_c', delay=True)
def run_c(**kwargs):
    # ...
    return
Run Code Online (Sandbox Code Playgroud)

使用链命令:

ret = chain(
    run_a.s(**kwargs),
    run_b.s(**kwargs),
    run_b.s(**kwargs)
).apply_async()
Run Code Online (Sandbox Code Playgroud)
  • 如果没有,apply_async一切都会按预期工作(同步)。
  • 'kwargs' 是一个字典。

django celery chain

5
推荐指数
1
解决办法
1178
查看次数

DRY:仅显示用户拥有的记录.可以使用models.Manager吗?

我需要向用户显示他拥有的对象.由于我需要在超过80%的观看次数上执行此操作,因此硬编码会导致DRY死亡.更重要的是,用户永远不会看到其他人拥有的记录.手工完成(在所有视图中)似乎也容易出错.

我一直在寻找装饰器(如login_required),但这似乎在请求处理过程的早期.是否可以将request.user值获取到自定义编写的管理器中并执行以下操作:

class CustomerManager(models.Manager):
    def get_query_set(self):
        return super(CustomerManager, self).get_query_set().filter(created_by=request.user)
Run Code Online (Sandbox Code Playgroud)

或者经理对象就像'不去!' 就请求信息而言,作为模型定义?

非常感谢.


这是保存对象的一部分,但纯粹在这里作为详细说明,而不是必要的阅读.

保存部分相对安全.我更改了模型上的object.save()函数,因此它将userid作为parm.

def save(self, userid):  
    self.created_by = userid    
    super(Customer, self).save(userid)
Run Code Online (Sandbox Code Playgroud)

在视图中:

if form.is_valid():
    customer = form.save(commit=False)
    customer.save(request.user)
Run Code Online (Sandbox Code Playgroud)

这样我以前不需要在我的视图中使用下面的行 customer.save...

    customer.created_by = request.user
Run Code Online (Sandbox Code Playgroud)

从而减少了错误.

django django-models

1
推荐指数
1
解决办法
869
查看次数