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

Django中如何优化仅部门、站点参数不同的重复视图与路由配置

Django场景最优实现方案

1. 重构通用视图

把重复逻辑抽成一个接收部门和站点编号参数的统一视图,替换之前逐个编写的重复视图,同时修正原有代码的线程安全问题:

from django.http import Http404

# 可根据实际业务调整合法范围配置
ALLOWED_DEPTS = ["FOO", "BAR"]
ALLOWED_STATIONS = {
    "FOO": [0,1,2,3],
    "BAR": [1,2,3,4]
}

def station_view(request, dept, station_id):
    # 合法性校验,避免非法参数访问
    if dept not in ALLOWED_DEPTS or station_id not in ALLOWED_STATIONS.get(dept, []):
        raise Http404("站点不存在")
    
    ctx = {
        "station": station_id,
        "dept": dept
    }

    if request.method == 'POST':
        form = my_form(request.POST)
        if form.is_valid():
            try:
                parsed_data = form.cleaned_data['full_scan']
                # 直接将部门、站点作为参数传入业务方法,替换原有的全局变量依赖
                saveScan(dept, station_id, parsed_data)
            except IndexError:
                ctx['error_message'] = error_message
                return HttpResponseRedirect('/error/input')
            return HttpResponseRedirect('/confirm')
    else:
        form = my_form()
    ctx['form'] = form
    # 动态拼接模板路径,无需硬编码
    return render(request, f'scan/{dept}/{dept}_station.html', ctx)

2. 简化路由配置

仅需要配置一条带参数的路由即可覆盖所有部门和站点的匹配需求,不需要逐个编写路由规则:

from django.urls import path
from . import views

urlpatterns = [
    # 其他原有路由保持不变
    path('<str:dept>/station_<int:station_id>/', views.station_view, name='station_view'),
]

如果需要反向生成对应站点的URL,直接传入参数即可:{% url 'station_view' dept='FOO' station_id=0 %}

3. 可选:参数强校验

如果需要从路由层就限制参数合法范围,可以使用正则路由实现:

from django.urls import re_path

urlpatterns = [
    # 仅匹配FOO/BAR部门、站点为纯数字的路径
    re_path(r'^(?P<dept>FOO|BAR)/station_(?P<station_id>\d+)/$', views.station_view, name='station_view'),
]

注意事项

  • 原有方案中使用全局变量Site_Data存储请求级的部门、站点信息属于线程不安全操作,多用户并发访问时会出现数据串扰,禁止使用全局变量传递请求上下文。
  • 原有路由配置中存在多个路由name属性重复的问题,使用通用路由后可完全避免该类低级错误。

内容的提问来源于stack exchange,提问作者Josh_At_Sorenson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:54:01