【问题标题】:Intercept every request in my Django app拦截我的 Django 应用程序中的每个请求
【发布时间】:2018-07-27 14:46:53
【问题描述】:

我想统计我网站上的访问次数。我的想法是使用 cookie 并设置时间。如果在一个小时内(例如)没有请求,然后有请求,我会将其计为新访问。 有没有办法在 Django 中拦截每个请求,而无需在每个视图函数中重复我的代码?

【问题讨论】:

  • 是的,使用中间件。但是为什么要重新发明轮子,而不是使用像 Google Analytics 这样的东西呢?
  • 我既不想使用谷歌分析也不想使用 django。为什么不适当地格式化服务器日志,通过它们 grep 并将结果保存在数据库中?
  • @WillemVanOnsem 你是对的,但我想创建自己的,作为 django 新手,它将帮助我学习一些东西
  • @raratiru:因为这正是开发人员转向 Google Analytics 的原因,因为 grepping 日志很麻烦,而且信息量不大。
  • @WillemVanOnsem 没问题,但 GDPR 对启用 cookie 提出了另一种想法,如果有人能以更简单的方式摆脱困境。当然,重新发明轮子不是一种选择!

标签: django


【解决方案1】:

是的,您可以使用 Django 中间件
例如: 我会在名为 my_app 的应用程序中创建一个名为 my_middleware.py 的文件,并创建一个在 Django 网站中定义的函数

def StatisticsMiddleware(get_response):
    def middleware(request):

        # Code to be executed for each request/response after
        # the view is called.

        return response #response should be defined before

    return middleware

并在你的 settings.py 中添加中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ......
    ......
    'my_app.my_middleware.StatisticsMiddleware' #here your middleware
]

不要忘记将结果保存在数据库中。您可以创建模型并使用 cookie。因此,如果您的条件正常,则保存到数据库中
设置 cookie:

response = get_response(request)
response.set_cookie('name_of_cookie', 'info_inside_the_cookie', 
    max_age=age_of_the_cookie)

更多详情 https://docs.djangoproject.com/en/2.0/topics/http/middleware/

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2018-08-23
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多