You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现用户登出再登录后仍保留登录时获取的笑话内容?

实现用户登出再登录后显示之前的冷笑话

核心思路

要实现登出再登录保留之前的笑话,关键是将用户当前的笑话持久化存储到数据库(会话在登出后会失效,无法满足需求),每次用户访问首页时优先读取存储的笑话,刷新时更新存储内容。

具体实现步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:03:18