Python中如何在Django框架中隐藏URL参数

正在写一个类似 v2 的社区,在首页点击类似下面的标签时重新返回数据
技术 创意 好玩 Apple 酷工作 交易 城市
超链接地址例如是"/?tab=2"
url 配置没有添加 url 参数,然后在视图里通过 get 获取 tab 参数,过滤数据,使用 render 返回渲染模板
现在主页点击这些标签时 url 地址会加上参数信息,请问如何隐藏?


Python中如何在Django框架中隐藏URL参数
10 回复

一个页面或者 apache 静态?


在Django里隐藏URL参数,通常有两种主流做法,看你的具体需求。

1. 用POST请求传参 这是最直接的方法。把参数放在POST请求的body里,而不是GET请求的URL里。这样参数就不会显示在地址栏。

# views.py
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
import json

@csrf_exempt
def my_view(request):
    if request.method == 'POST':
        # 从POST的body里取数据,比如JSON
        data = json.loads(request.body)
        param_value = data.get('secret_param')
        # ... 处理逻辑
        return HttpResponse(f"Received: {param_value}")
    return render(request, 'form.html')

前端用JavaScript发POST请求,或者用表单(记得设置method="post")。

2. 用Session(会话) 把参数存在服务器端的session里,只传一个session key。这是处理需要跨多个请求的参数的经典方式。

# 第一个视图:存参数
def set_param_view(request):
    request.session['secret_param'] = 'my_secret_value'
    return HttpResponse('Parameter stored in session.')

# 第二个视图:取参数
def get_param_view(request):
    param_value = request.session.get('secret_param')
    if param_value:
        return HttpResponse(f"Got from session: {param_value}")
    return HttpResponse('No parameter in session.')

用户访问set_param_view后,参数就存好了,之后在同一个会话里访问get_param_view就能拿到,URL上啥也没有。

总结一下:

  • 如果是一次性的参数传递,用POST请求
  • 如果参数需要在用户浏览的多个页面间持续存在,用Session

一句话建议: 根据参数的使用范围,在POST和Session之间选一个。

改用 post 就可以了。

js 发起 get 请求并将数据渲染到当前页面 没有刷新页面,url 不变

post 请求可以隐藏这些

其实你还可以放在 session 里面,不过每次都要修改 session 很蛋疼

谢谢各位的思路,其实我还想知道本站是怎么做的,就是首页“技术 创意”那个标签栏

就是你这样的实现的呀! V2EX 只是把首页和技术也映射到了同一个视图函数。

/(?P<tab>\d+)/

或者前面加一个 nginx 进行 rewrite

我也是看了 V2EX 首页也改了下我的站,哈哈, url 里加参数我自定义的模板函数,还得替换 class 的 active ,我搞了一下午

回到顶部