标签: django-middleware

如何在django中设置自定义中间件

我正在尝试创建中间件,以便可选地将kwarg传递给满足条件的每个视图.

问题是我找不到如何设置中间件的示例.我见过的类覆盖了我想要的方法,process_view:

Class CheckConditionMiddleware(object):  
    def process_view(self, request):  

        return None  
Run Code Online (Sandbox Code Playgroud)

但是我把这个课程放在哪里?我是否创建了一个中间件应用程序并将此类放在其中,然后在settings.middleware中引用它?

python django django-middleware django-views

70
推荐指数
3
解决办法
4万
查看次数

Django异常中间件:TypeError:object()不带参数

我正在使用Django 1.10并尝试捕获异常中间件的所有异常.

下面的代码导致内部服务器错误:

mw_instance = middleware(handler)
TypeError: object() takes no parameters
Run Code Online (Sandbox Code Playgroud)

views.py

from django.http import HttpResponse

def my_view(request):
    x = 1/0 # cause an exception
    return HttpResponse("ok")
Run Code Online (Sandbox Code Playgroud)

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',
    'myproject.middleware.ExceptionMiddleware',  

]
Run Code Online (Sandbox Code Playgroud)

middleware.py

from django.http import HttpResponse

class ExceptionMiddleware(object):
    def process_exception(self, request, exception): 
        return HttpResponse("in exception")
Run Code Online (Sandbox Code Playgroud)

我已经看到这些object()在django 1.10和其他问题中没有参数讨论中间件和middleware_classes,但我不确定这是如何适用于这种情况,或者我实际需要改变以解决问题.

django django-middleware

51
推荐指数
2
解决办法
2万
查看次数

Django启动代码放在哪里?

我想在服务器启动(开发和生产)上执行这些代码行:

from django.core import management
management.call_command('syncdb', interactive=False)
Run Code Online (Sandbox Code Playgroud)

放入settings.py它不起作用,因为它需要已经加载设置.

将它们放在视图中并从外部访问该视图也不起作用,因为有些中间件使用数据库而这些中间件将失败并且不允许我访问视图.

将它们放在中间件中会起作用,但每次访问我的应用程序时都会调用它.一个可能的解决方案可能是创建一个中间件来完成所有工作,然后将其自身移除,MIDDLEWARE_CLASSES因此不再调用它.如果没有太多的猴子补丁,我可以这样做吗?

python django django-middleware

50
推荐指数
2
解决办法
2万
查看次数

基于User-Agent更改Django模板

我做了一个Django网站,但我喝了Koolaid,我想制作一个iPhone版本.经过深思熟虑,我提出了两个选择:

  1. 制作一个完整的其他网站,例如i.xxxx.com.使用Django的站点框架将其绑定到同一个数据库中.
  2. 找一些读取用户代理的中间件,并动态更改模板目录.

不过,我真的更喜欢选项#2; 我有一些保留意见,主要是因为Django文档不鼓励动态更改设置.我找到了一个可以做我喜欢的片段.我的主要问题是让它尽可能无缝,我希望它对用户来说是自动化和透明的.

还有其他人遇到同样的问题吗?是否有人愿意分享他们如何解决制作iPhone版Django网站的问题?

更新

我使用了中间件和调整模板调用的组合.

对于中间件,我使用了minidetector.我喜欢它,因为它检测到过多的移动用户代理.我所要做的就是在我的视图中检查request.mobile.

对于模板调用调整:

 def check_mobile(request, template_name):
     if request.mobile:
         return 'mobile-%s'%template_name
     return template_name
Run Code Online (Sandbox Code Playgroud)

我使用它来查看我知道我有两个版本的任何视图.

去做:

  • 弄清楚如何在render_to_response的扩展版本中访问request.mobile,这样我就不必使用check_mobile('template_name.html')
  • 如果不存在移动版本,则使用先前的自动回退到常规模板.

python django django-templates django-middleware mobile-website

40
推荐指数
2
解决办法
2万
查看次数

Django中的非全局中间件

在Django中有一个设置文件,用于定义要在每个请求上运行的中间件.此中间件设置是全局的.有没有办法在每个视图的基础上指定一组中间件?我希望特定的URL使用一组与全局集不同的中间件.

python django middleware django-middleware

36
推荐指数
3
解决办法
1万
查看次数

Python和Django OperationalError(2006,'MySQL服务器已经消失')

原文:我最近开始从我的一些旧代码中获取MySQL OperationalErrors,似乎无法追溯问题.由于它之前的工作,我认为它可能是一个破坏了一些东西的软件更新.我正在使用带有nginx的django runfcgi的python 2.7.这是我的原始代码:

views.py

DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
db = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
cursor = db.cursor()

def list(request):
    statement = "SELECT item from table where selected = 1"
    cursor.execute(statement)
    results = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容,但它仍然无效:

views.py

class DB:
    conn = None
    DBNAME = "test"
    DBIP = "localhost"
    DBUSER = "django"
    DBPASS = "password"
def connect(self):
    self.conn = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
def cursor(self):
    try:
        return self.conn.cursor()
    except (AttributeError, MySQLdb.OperationalError):
        self.connect()
        return self.conn.cursor()

db = DB()
cursor = db.cursor() …
Run Code Online (Sandbox Code Playgroud)

python mysql django nginx django-middleware

29
推荐指数
2
解决办法
4万
查看次数

Django MiddleWare订购的实用规则?

官方文档有点混乱:'之前'和'之后'用于在元组中订购MiddleWare,但在某些地方'之前'和'之后'指的是请求 - 响应阶段.此外,'应该是第一个/最后一个'是混合的,并且不清楚哪个用作"第一个".

我确实理解了它的不同......然而,对于Django的新手而言似乎很复杂.

你能为内置的MiddleWare课程建议一些正确的顺序(假设我们启用了所有这些课程),并且 - 最重要的是 - 解释为什么在其他课程之前/之后?

这是列表,其中包含我设法找到的文档中的信息:

  1. UpdateCacheMiddleware
    • 那些修改"之前有所不同:" SessionMiddleware,GZipMiddleware,LocaleMiddleware
  2. GZipMiddleware
    • 在任何可能改变或使用响应机构的MW之前
    • 之后UpdateCacheMiddleware:修改'变化:'
  3. ConditionalGetMiddleware
    • 之前CommonMiddleware:使用其'Etag:'标题时USE_ETAGS=True
  4. SessionMiddleware
    • 之后UpdateCacheMiddleware:修改'变化:'
    • 之前TransactionMiddleware:我们不需要这里的交易
  5. LocaleMiddleware,SessionMiddleware,CacheMiddleware之后的最顶级之一
    • 之后UpdateCacheMiddleware:修改'变化:'
    • 之后SessionMiddleware:使用会话数据
  6. CommonMiddleware
    • 在任何可能改变响应的MW之前(它计算ETags)
    • 之后GZipMiddleware,它不会计算gzip压缩内容的电子标签
    • 靠近顶部:当APPEND_SLASH或时它重定向PREPEND_WWW
  7. CsrfViewMiddleware
    • 在任何假定已经处理了CSRF攻击的视图中间件之前
  8. AuthenticationMiddleware
    • 之后SessionMiddleware:使用会话存储
  9. MessageMiddleware
    • 之后SessionMiddleware:可以使用基于会话的存储
  10. XViewMiddleware
  11. TransactionMiddleware
    • 在使用DB的MW之后:(可SessionMiddleware配置为使用DB)
    • 全部*CacheMiddleWare不受影响(作为例外:使用自己的数据库游标)
  12. FetchFromCacheMiddleware
    • 在那些修改'Vary:'之后,如果使用它们来为缓存哈希键选择一个值
    • 之后AuthenticationMiddleware就可以使用了CACHE_MIDDLEWARE_ANONYMOUS_ONLY
  13. FlatpageFallbackMiddleware
    • 底部:不得已
    • 然而,使用DB不是问题TransactionMiddleware (是吗?) …

django django-middleware

28
推荐指数
1
解决办法
4150
查看次数

如何从django自定义中间件类返回rest_framework.response对象?

我正在尝试编写一个确保用户登录的中间件类.但问题是这个中间件类只适用于一小组视图,这些视图返回DRF的Response对象而不是HTTPResponse对象,这些视图也是装饰用api_view.

因此,当我尝试从中间ware类返回一个Response对象时,它会引发此错误.

 assert renderer, ".accepted_renderer not set on Response"
AssertionError: .accepted_renderer not set on Response
Run Code Online (Sandbox Code Playgroud)

我在SO上搜索了一下,我猜错误与api_view装饰器有某种关系.但我对如何解决这个问题很困惑.

任何帮助表示赞赏.:)

django django-middleware django-rest-framework

26
推荐指数
2
解决办法
2万
查看次数

Django:重启后"没有名为context_processors的模块"错误

我有一个可以在我的电脑上运行的Django站点,并在加载后在我的服务器上工作.我注意到我的服务器有Django 1.6,我升级到1.8.

重新启动后,我的网站上没有任何页面加载,我收到错误:

ImportError没有名为context_processors的模块

我阅读了关于Django和allauth的文档.Django中提到,在1.8 context_processors移动和allauth说具体allauth标签不再需要在TEMPLATE_CONTEXT_PROCESSORSsettings.py.

Django:https://docs.djangoproject.com/en/1.8/ref/settings/

Allauth:https://django-allauth.readthedocs.org/en/latest/installation.html

其他人遇到这个?我是在正确的轨道上吗?我需要在设置中更改某些内容吗?我无法确定它是否是Django或allauth问题所以不确定从哪里开始.

任何帮助表示赞赏!

追溯:

Django Version: 1.8.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'plant',
 'journal',
 'userimg',
 'django.contrib.sites',
 'allauth',
 'allauth.account')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.egg/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/django/django_project/plant/views.py" in plant_main
  24.     return render(request, 'plant/plant_main.html', context)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.egg/django/shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.egg/django/template/loader.py" …
Run Code Online (Sandbox Code Playgroud)

python django django-middleware django-settings

26
推荐指数
2
解决办法
3万
查看次数

响应发送到客户端后,在Django中执行代码

在我的Django应用程序中,我想跟踪响应是否已成功发送到客户端.我很清楚在像HTTP这样的无连接协议中没有"防水"方式来确保客户端已经接收(并显示)了响应,所以这不是关键任务功能,但我仍然希望在最新的可能时间.响应将不是HTML,因此任何来自客户端的回调(使用Javascript或IMG标签等)都是不可能的.

我能找到的"最新"钩子是在中间件列表的第一个位置添加一个实现process_response的自定义中间件,但根据我的理解,这是在构造实际响应并发送到客户端之前执行的.Django中是否有任何钩子/事件在响应成功发送后执行代码?

django http httpresponse django-middleware django-views

19
推荐指数
2
解决办法
5984
查看次数