Django使变量广泛可用的选项

Pho*_*beB 5 django decorator

每次打开页面时,我都希望获得当前活动的项目ID.这将通过查找子域并验证当前登录的用户可以查看它来完成.

一旦我达到我的观点,我希望能够做到

tasks = Task.objects.filter(project = current_project)
Run Code Online (Sandbox Code Playgroud)

WHere current_project(或CURRENT_PROJECT或current_project ???)已经设置好了.

任何人都可以解释我在文档中找到的各种方法的优缺点,并让我走上正轨吗?

  1. 会议
  2. 中间件
  3. 穿线
  4. 内建

这就是我最终做到的方式:

装饰:

def check4project(fn):

    current_project = 'fred'
    def check(*args, **kw):
        kw['project']=current_project
        return fn(*args, **kw)
    return check
Run Code Online (Sandbox Code Playgroud)

查看示例

@login_required
@check4project
@tweetpost
def index(request, project=0):

    print project
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 4

这完全取决于“当前项目”的语义是什么。以下是一些可能性:

  1. 这可能是用户的一个特征:他访问他的个人资料页面并设置当前项目。这将存储在数据库中,您可以使用 ORM 访问它。

  2. 它可能是 URL 的一个特征,仅基于子域。这可以通过中间件来完成,中间件可以访问请求,例如可以解析主机名并在请求上设置可以在视图函数中访问的自定义属性。

  3. 与 #2 类似,如果检查项目是针对某些视图而不是全部视图完成的,则可以使用视图装饰器。这类似于 Django 用于检查授权的装饰器。

  4. 这可能是用户访问该网站的一个特征:他访问一个项目页面,选择一个项目进行工作,并且该页面会一直粘着,直到他选择另一个项目。这最好存储在会话中,该会话专门用于此类临时存储。

根据您的描述,听起来 #2 或 #3 最适合您,具体取决于您的观点如何在关心子项目和不关心子项目之间划分。