如何实现用户登出再登录后仍保留登录时获取的笑话内容?
实现用户登出再登录后显示之前的冷笑话
核心思路
要实现登出再登录保留之前的笑话,关键是将用户当前的笑话持久化存储到数据库(会话在登出后会失效,无法满足需求),每次用户访问首页时优先读取存储的笑话,刷新时更新存储内容。
具体实现步骤
1. 扩展用户模型,添加笑话存储字段
创建一个与User关联的Profile模型,用于存储用户的当前笑话:
# models.py from django.contrib.auth.models import User from django.db import models class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) current_joke = models.TextField(blank=True, null=True) def __str__(self): return self.user.username
2. 配置信号,自动为新用户创建Profile
确保新用户注册时自动生成对应的Profile记录:
# signals.py from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from .models import UserProfile @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.userprofile.save()
记得在apps.py中注册信号:
# apps.py from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): import your_app_name.signals
3. 修改视图逻辑,优先读取存储的笑话
更新home视图,判断用户是否已有存储的笑话,刷新时更新存储内容:
# views.py import requests from django.shortcuts import render from django.contrib.auth.decorators import login_required from .models import UserProfile @login_required def home(request): profile = request.user.userprofile joke = None # 处理刷新请求(支持GET参数或POST提交) if request.method == 'POST' or request.GET.get('refresh') == '1': # 调用API获取新笑话 url = 'https://icanhazdadjoke.com/' headers = {"Accept": "application/json"} response = requests.get(url, headers=headers) joke_data = response.json() joke = joke_data['joke'] # 更新数据库中存储的笑话 profile.current_joke = joke profile.save() else: # 优先读取已存储的笑话 if profile.current_joke: joke = profile.current_joke else: # 首次访问无存储时,获取新笑话并保存 url = 'https://icanhazdadjoke.com/' headers = {"Accept": "application/json"} response = requests.get(url, headers=headers) joke_data = response.json() joke = joke_data['joke'] profile.current_joke = joke profile.save() return render(request, 'test_section/Home.html', {'joke': joke})
4. 更新模板,添加刷新按钮
在Home.html中添加刷新按钮,触发笑话更新:
<!-- test_section/Home.html --> <div class="joke-container"> <p>{{ joke }}</p> <!-- 方式1:GET请求刷新 --> <a href="?refresh=1" class="btn btn-refresh">刷新笑话</a> <!-- 方式2:POST请求刷新(更安全,需CSRF令牌) --> <!-- <form method="post"> {% csrf_token %} <button type="submit" class="btn btn-refresh">刷新笑话</button> </form> --> </div>
关键说明
- 使用数据库存储而非会话:会话在用户登出后会被销毁,无法保留数据;数据库存储是持久化的,用户再次登录时可直接读取。
- 刷新逻辑:点击刷新按钮时,重新调用API获取新笑话并更新数据库中的记录,确保下次访问显示最新的笑话。
内容的提问来源于stack exchange,提问作者Muhammad Taimoor
相关产品推荐
相关产品推荐

