当使用@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但禁用'自动下一个'功能.
谁可以对这个问题有所了解?
非常感谢.
杰拉德.
我为经过身份验证的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状态字段值,但没有运气:(
有人可以给我一个指针,说明为什么我需要将我的项目根路径添加到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) 我有一个工作链,但是当我添加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一切都会按预期工作(同步)。我需要向用户显示他拥有的对象.由于我需要在超过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)
从而减少了错误.