Django CKEditor 上传图片提示“不正确的服务器响应”的解决办法
开发环境
django 1.11
django-ckeditor 5.3.1(CKEditor 4.7.3)
发生背景
前端页面引用了 CKEditor 富文本编辑器,Django 未登录的时候上传文件就会报:"不正确的服务器响应"。
错误提示
Incorrect Server Response
控制台日志
GET /admin/login/?next=/ckeditor/upload/ HTTP/1.1
从控制台可以看出来,会跳转到 admin 登录页面,也就是需要验证登录才能上传,那怎么才能取消登录验证呢?
查看 ckeditor 源码
..\Lib\site-packages\ckeditor_uploader\urls.py
from __future__ import absolute_import
import django
from django.conf.urls import url
from django.contrib.admin.views.decorators import staff_member_required
from django.views.decorators.cache import never_cache
from . import views
if django.VERSION >= (1, 8):
urlpatterns = [
url(r'^upload/', staff_member_required(views.upload), name='ckeditor_upload'),
# url(r'^upload/', views.upload, name='ckeditor_upload'), # ckeditor 上传文件不验证登录状态
url(r'^browse/', never_cache(staff_member_required(views.browse)), name='ckeditor_browse'),
]
else:
from django.conf.urls import patterns
urlpatterns = patterns(
'',
url(r'^upload/', staff_member_required(views.upload), name='ckeditor_upload'),
url(r'^browse/', never_cache(staff_member_required(views.browse)), name='ckeditor_browse'),
)
在上面第 12 行代码这里可以看到,views.upload 还加一个 staff_member_required 验证,点进去看一下:
..\Lib\site-packages\django\contrib\admin\views\decorators.py
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test
def staff_member_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME,
login_url='admin:login'):
"""
Decorator for views that checks that the user is logged in and is a staff
member, redirecting to the login page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_active and u.is_staff,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if view_func:
return actual_decorator(view_func)
return actual_decorator
从 staff_member_required 可以看出验证了 lambda u: u.is_active and u.is_staff 状态,所以我们要想去掉 ckeditor 的上传文件的验证,就需要放开登录验证,通过修改 ckeditor 上传路由的那行代码,能关掉登录验证。
解决方法
..\Lib\site-packages\ckeditor_uploader\urls.py 下把 staff_member_required 去掉:
from django.contrib.admin.views.decorators import staff_member_required
urlpatterns = [
# url(r'^upload/', staff_member_required(views.upload), name='ckeditor_upload'),
url(r'^upload/', views.upload, name='ckeditor_upload'), # ckeditor 上传文件不验证登录状态
url(r'^browse/', never_cache(staff_member_required(views.browse)), name='ckeditor_browse'),
]
也可以自己写一个验证规则,替换掉 staff_member_required。
staff_member_required 拓展
此函数可以拓展到任何一个路由上,做登录验证,也可以重写 staff_member_required 验证逻辑。
比如,本地的 media 文件需要登录了才能查看
# django 1.11.x
from django.conf.urls import url
from django.views.static import serve
from django.conf import settings
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
urlpatterns = [
url(r'^media/(?P<path>.*)$', staff_member_required(serve), {"document_root": settings.MEDIA_ROOT}),
]
# ..\Lib\site-packages\django\contrib\auth\decorators.py
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
"""
Decorator for views that checks that the user is logged in, redirecting
to the log-in page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_authenticated,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
相关文章
- 使用 AWS IoT 按钮实现按需 VPN 访问
- 2018 年十大热门文章
- 了解 AWS 服务和解决方案 – AWS 1 月在线技术讲座
- 在 EKS 上使用 Kubernetes Service Catalog 和 AWS Service Broker
- KubeCon 西雅图 2018 年回顾
- 回顾:2018 年 re:Invent 大会上的开源
- AWS Cognito User Pool 实现 Alexa 账户关联
- 为您的 IT 挑战选择正确工具
- 使用 AWS CDK 增强您的基础设施
- java.net.UnknownHostException
- java_ant详解
- JAVA_ant详解
- 基于 Tag 驱动的 EBS 类型优化 CloudFormation 模板
- 动手 lambda 新功能—custom runtime
- 分布式 Lambda 从海外到中国自动同步S3文件
- 在 IT 教学中使用 AWS AI 和 Amazon Sumerian
- 新开放 – AWS 欧洲(斯德哥尔摩)区域
- 接下来,听听我们的 AWS 英雄怎么说…
- etcd 目前为 CNCF 孵化项目
- 隆重推出 AWS 架构完善合作伙伴计划