我正在尝试创建中间件,以便可选地将kwarg传递给满足条件的每个视图.
问题是我找不到如何设置中间件的示例.我见过的类覆盖了我想要的方法,process_view:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
Run Code Online (Sandbox Code Playgroud)
但是我把这个课程放在哪里?我是否创建了一个中间件应用程序并将此类放在其中,然后在settings.middleware中引用它?
我正在使用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,但我不确定这是如何适用于这种情况,或者我实际需要改变以解决问题.
我想在服务器启动(开发和生产)上执行这些代码行:
from django.core import management
management.call_command('syncdb', interactive=False)
Run Code Online (Sandbox Code Playgroud)
放入settings.py它不起作用,因为它需要已经加载设置.
将它们放在视图中并从外部访问该视图也不起作用,因为有些中间件使用数据库而这些中间件将失败并且不允许我访问视图.
将它们放在中间件中会起作用,但每次访问我的应用程序时都会调用它.一个可能的解决方案可能是创建一个中间件来完成所有工作,然后将其自身移除,MIDDLEWARE_CLASSES因此不再调用它.如果没有太多的猴子补丁,我可以这样做吗?
我做了一个Django网站,但我喝了Koolaid,我想制作一个iPhone版本.经过深思熟虑,我提出了两个选择:
不过,我真的更喜欢选项#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)
我使用它来查看我知道我有两个版本的任何视图.
去做:
python django django-templates django-middleware mobile-website
在Django中有一个设置文件,用于定义要在每个请求上运行的中间件.此中间件设置是全局的.有没有办法在每个视图的基础上指定一组中间件?我希望特定的URL使用一组与全局集不同的中间件.
原文:我最近开始从我的一些旧代码中获取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) 官方文档有点混乱:'之前'和'之后'用于在元组中订购MiddleWare,但在某些地方'之前'和'之后'指的是请求 - 响应阶段.此外,'应该是第一个/最后一个'是混合的,并且不清楚哪个用作"第一个".
我确实理解了它的不同......然而,对于Django的新手而言似乎很复杂.
你能为内置的MiddleWare课程建议一些正确的顺序(假设我们启用了所有这些课程),并且 - 最重要的是 - 解释为什么在其他课程之前/之后?
这是列表,其中包含我设法找到的文档中的信息:
UpdateCacheMiddleware
SessionMiddleware,GZipMiddleware,LocaleMiddlewareGZipMiddleware
UpdateCacheMiddleware:修改'变化:'ConditionalGetMiddleware
CommonMiddleware:使用其'Etag:'标题时USE_ETAGS=TrueSessionMiddleware
UpdateCacheMiddleware:修改'变化:'TransactionMiddleware:我们不需要这里的交易LocaleMiddleware,SessionMiddleware,CacheMiddleware之后的最顶级之一
UpdateCacheMiddleware:修改'变化:'SessionMiddleware:使用会话数据CommonMiddleware
GZipMiddleware,它不会计算gzip压缩内容的电子标签APPEND_SLASH或时它重定向PREPEND_WWWCsrfViewMiddleware
AuthenticationMiddleware
SessionMiddleware:使用会话存储MessageMiddleware
SessionMiddleware:可以使用基于会话的存储XViewMiddlewareTransactionMiddleware
SessionMiddleware配置为使用DB)*CacheMiddleWare不受影响(作为例外:使用自己的数据库游标)FetchFromCacheMiddleware
AuthenticationMiddleware就可以使用了CACHE_MIDDLEWARE_ANONYMOUS_ONLYFlatpageFallbackMiddleware
TransactionMiddleware (是吗?) …我正在尝试编写一个确保用户登录的中间件类.但问题是这个中间件类只适用于一小组视图,这些视图返回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 1.6,我升级到1.8.
重新启动后,我的网站上没有任何页面加载,我收到错误:
ImportError没有名为context_processors的模块
我阅读了关于Django和allauth的文档.Django中提到,在1.8 context_processors移动和allauth说具体allauth标签不再需要在TEMPLATE_CONTEXT_PROCESSORS的settings.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) 在我的Django应用程序中,我想跟踪响应是否已成功发送到客户端.我很清楚在像HTTP这样的无连接协议中没有"防水"方式来确保客户端已经接收(并显示)了响应,所以这不是关键任务功能,但我仍然希望在最新的可能时间.响应将不是HTML,因此任何来自客户端的回调(使用Javascript或IMG标签等)都是不可能的.
我能找到的"最新"钩子是在中间件列表的第一个位置添加一个实现process_response的自定义中间件,但根据我的理解,这是在构造实际响应并发送到客户端之前执行的.Django中是否有任何钩子/事件在响应成功发送后执行代码?