我知道HttpResponseRedirect只接受一个参数,一个URL.但有些情况下我想重定向并显示错误消息.
我正在阅读这篇文章:如何使用HTTP重定向(在Django中)传递信息,并且有很多好的建议.我真的不想使用我不知道如何工作的库.我不想依赖于根据Django文档将被删除的消息.我想过使用会话.我也喜欢在URL中传递它的想法,例如:
return HttpResponseRedirect('/someurl/?error=1')
Run Code Online (Sandbox Code Playgroud)
然后有一些从错误代码到消息的映射.拥有类似于全局地图的结构是不错的做法,这些结构在这些错误消息中是硬代码还是有更好的方法?
或者我应该只使用会话
编辑:我使用会话工作.将这样的事情放在会话中是一种很好的做法吗?
我有两个问题:
1)我想知道是否使用
django.contrib.sessions.backends.cache
Run Code Online (Sandbox Code Playgroud)
存储会话真的可以提高网站的性能吗?假设有大约25,000个并发用户.每个用户进行许多数据库更改(例如浏览器游戏).差异甚至是显而易见的吗?
2)再次使用缓存会话(没有数据库):如何检查给定用户是否已登录(不允许在同一帐户上多次登录)?
我正在创建一个以REST为中心的应用程序,它将为大多数特定于域的模型使用某种NoSQL数据存储.对于我打算围绕REST数据框架构建的主站点,我仍然希望将传统的关系数据库用于用户,计费信息以及域数据模型范围之外的其他元数据.
我被告知,如果我可以尽可能避免在同一请求上对RDBMS和NoSQL数据存储执行I/O,那么这种方法只是个好主意.
我的问题:
有没有办法可以跟踪会话在 Django 中存在的时间长度?
有没有办法让 Django 在会话到期时运行一个函数?这将允许我这样做。
谢谢!
目前,我有一个Cart每个注册的模型CustomUser(OneToOne关系):
class Cart(models.Model):
created_at = models.DateTimeField(auto_now_add = True)
user = models.OneToOneField(CustomUser, related_name='cart')
Run Code Online (Sandbox Code Playgroud)
但现在我对匿名用户(访客)有一些要求.在寻找一些文章后,似乎需要会话?
GuestCart模型:
GuestCart.objects.create(session = request.session['cart']) #just pseudo-code, I don't sure how to do this 打电话时查看吗?GuestCart将存活一个星期(从GuestCart已建立的数量开始.时间不会更新为客人的活动),并应在过期时自动删除.**更新@ 2015年3月21日:目前,我添加了一个新的密钥cart_id进入request.session,而不是保存会话信息到数据库.
我需要在特定时间后注销用户(现在将其设为 1 分钟),因此创建了一个中间件类,如下所示
我的项目/中间件.py
from datetime import datetime, timedelta
from django.contrib import auth
class AutoLogout:
def process_request(self, request):
if not request.user.is_authenticated() :
#Can't log out if not logged in
return
try:
if datetime.now() - request.session['last_touch'] > timedelta( 0, settings.AUTO_LOGOUT_DELAY * 60, 0):
auth.logout(request)
del request.session['last_touch']
return
except KeyError:
pass
request.session['last_touch'] = datetime.now()
Run Code Online (Sandbox Code Playgroud)
设置.py
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'myproject.middleware.HttpErrorHandler',
'myproject.middleware.AutoLogout'
)
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
AUTO_LOGOUT_DELAY = 1
Run Code Online (Sandbox Code Playgroud)
Djagno 版本是 1.4.12
但是上面的代码不起作用,我不确定我哪里做错了,所以有人可以让我知道为什么上面的代码不起作用以及如何每 1 分钟或 5 分钟注销用户吗?
我试图将在一个视图中获得的查询结果保存到会话中,并在另一个视图中检索它,所以我尝试了以下操作:
def default (request):
equipment_list = Equipment.objects.all()
request.session['export_querset'] = equipment_list
Run Code Online (Sandbox Code Playgroud)
但是,这给了我
TypeError at /calbase/
<QuerySet [<Equipment: A>, <Equipment: B>, <Equipment: C>]> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我想知道这到底是什么意思,我应该怎么做?也许除了使用会话之外,还有其他方法可以做我想要的事情?
谁能帮助我解决以下挑战?
我有一个用户可以注册的注册模板。然后将它们重定向到带有付款按钮的 URL,并在成功付款时激活。在 HTML 模板中,我将用户名存储在付款按钮内的自定义字段中,用于稍后激活帐户。现在由于用户尚未激活/登录,我还不能像 {{user.username}} 一样调用用户对象。所以我想尝试会话来解决这个问题并在注册期间捕获用户名以检索此会话变量并将其放在不同页面上的自定义字段中。但是如何?我尝试使用 request.session 但我不确定在哪里适合这个下面的文件,然后如何在 html 模板中调用这个变量。
非常感谢任何建议或帮助!
这是我的regbackend.py
class MyRegistrationView(RegistrationView):
form_class = UserProfileRegistrationForm
def register(self, form_class):
user_package.username = form_class.cleaned_data['username']
Run Code Online (Sandbox Code Playgroud)
这里是我的forms.py
class SignUpForm(forms.ModelForm):
class Meta:
model = SignUp
fields = ['username', 'email']
Run Code Online (Sandbox Code Playgroud)
这是我的注册.html
<form method="post" action=".">
{% csrf_token %}
{{ form.username|as_crispy_field }}
<input class="btn btn-success" type="submit" value="{% trans 'Submit' %}" /></form>
Run Code Online (Sandbox Code Playgroud)
最后是使用付款按钮和自定义字段注册后的 HTML 模板。
<form action="some-url" method="post" target="_top">
<input type="hidden" name="custom" value="{{ session.username? }}">
</form>
Run Code Online (Sandbox Code Playgroud)
我使用 Django 1.9x 和 Django-registration-redux
我有一个带有复选框的多步骤表单,在用户提交第一步表单后,我保存他在会话中检查的对象,在第二步表单中,我想使用会话数据过滤对象。
为了实现这一点,我需要在第二步中获取新 ModelForm 上的会话,不幸的request是没有在表单中定义。
我如何访问我的会话?
class IconSubChoiceForm(forms.ModelForm):
session_icons = request.session.get('icons')
query = Q(tags__contains=session_icons[0]) | Q(tags__contains=session_icons[1]) | Q(tags__contains=session_icons[2])
icons = CustomSubChoiceField(queryset=CanvaIcon.objects.filter(query), widget=forms.CheckboxSelectMultiple)
class Meta:
model = CanvaIcon
fields = ['icons']
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我刚开始学习 Django 会话(以及一般的 Django)。在我看来 request.session 的功能就像一本字典,但我不确定我可以在上面保存多少数据。到目前为止,我看过的大多数示例都使用 request.session 来存储相对较小的数据,例如短字符串或整数。那么我可以在 request.session 上保存的数据量是否有限制,还是与我使用的数据库更相关?
我有这个问题的部分原因是我不完全理解 request.session 的存储是如何工作的。它是否像另一个模型一样工作?如果是这样,我如何访问管理页面上的密钥/项目?
提前感谢您的任何帮助!
django ×10
django-sessions ×10
python ×4
session ×2
caching ×1
django-cache ×1
django-forms ×1
memcached ×1
nosql ×1