Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件上载时,OSError[Errno 13]权限被拒绝_Python_Django - Fatal编程技术网

Python 文件上载时,OSError[Errno 13]权限被拒绝

Python 文件上载时,OSError[Errno 13]权限被拒绝,python,django,Python,Django,在Django上,当我提交具有图像字段的modelform时,在保存模型时,在保存上载的文件时,会引发此错误 这个模型有一条简单的直线 student(model): photo = models.ImageField(upload_to='/photos') 提交表单时会引发此错误 OSError(13, 'Permission denied') 此时在模型保存方法util中发生 /usr/lib/python2.7/site-packages/django/core/files/

在Django上,当我提交具有图像字段的modelform时,在保存模型时,在保存上载的文件时,会引发此错误

这个模型有一条简单的直线

student(model):
    photo = models.ImageField(upload_to='/photos')
提交表单时会引发此错误

OSError(13, 'Permission denied')
此时在模型保存方法util中发生

/usr/lib/python2.7/site-packages/django/core/files/storage.py in _save
                fd = os.open(full_path, flags, 0o666)
引发错误的部件代码为

flags = (os.O_WRONLY | os.O_CREAT | os.O_EXCL |
                         getattr(os, 'O_BINARY', 0))
                # The current umask value is masked out by os.open!
fd = os.open(full_path, flags, 0o666)
检查Django源代码中的这一行:

变量内容

e : OSError(13, 'Permission denied')
name : u'photos/10703514_652406348206730_7516458761930522613_n.jpg'
self : <django.core.files.storage.FileSystemStorage object at 0x3654550>
content : <ImageFieldFile: 10703514_652406348206730_7516458761930522613_n.jpg>
flags : 193
directory : u'/var/www/pr5/mediafolder/photos'
full_path : u'/var/www/pr5/mediafolder/photos/10703514_652406348206730_7516458761930522613_n.jpg'
我得到了同样的错误,所以这不是权限问题,而是其他限制

/var/www/pr5/是项目目录

用户和组都是cherokee:cherokee代表它下面目录中的所有文件

chown -R cherokee:cherokee *
chmod是777,也应该是770

我使用cherokee作为Web服务器来提供静态和媒体文件 使用此命令在套接字上运行

/usr/bin/python2 /var/www/pr5/manage.py runfcgi method=threaded socket=/tmp/djangoche.socket daemonize=False protocol=scgi 
设置.py

FILE_UPLOAD_PERMISSIONS = 770
FILE_UPLOAD_DIRECTORY_PERMISSIONS =770


MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR + '/mediafolder/'
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR + '/staticfolder/'
STATICFILES_DIRS = (
BASE_DIR + STATIC_URL,
)
跟踪是

Environment:


Request Method: POST
Request URL: http://localhost/student/new

Django Version: 1.7
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'widget_tweaks',
 'school')
Installed Middleware:
('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')


Traceback:
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/var/www/pr5/school/views.py" in post
  313.             studentvar=stu.save()
File "/usr/lib/python2.7/site-packages/django/forms/models.py" in save
  457.                              construct=False)
File "/usr/lib/python2.7/site-packages/django/forms/models.py" in save_instance
  103.         instance.save()
File "/usr/lib/python2.7/site-packages/django/db/models/base.py" in save
  590.                        force_update=force_update, update_fields=update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py" in save_base
  618.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py" in _save_table
  699.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py" in _do_insert
  732.                                using=using, raw=raw)
File "/usr/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method
  92.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py" in _insert
  921.         return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
  919.             for sql, params in self.as_sql():
File "/usr/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in as_sql
  877.                 for obj in self.query.objs
File "/usr/lib/python2.7/site-packages/django/db/models/fields/files.py" in pre_save
  301.             file.save(file.name, file, save=False)
File "/usr/lib/python2.7/site-packages/django/db/models/fields/files.py" in save
  89.         self.name = self.storage.save(name, content)
File "/usr/lib/python2.7/site-packages/django/core/files/storage.py" in save
  51.         name = self._save(name, content)
File "/usr/lib/python2.7/site-packages/django/core/files/storage.py" in _save
  222.                     fd = os.open(full_path, flags, 0o666)

Exception Type: OSError at /student/new
Exception Value: [Errno 13] Permission denied: '/var/www/pr5/mediafolder/10703514_652406348206730_7516458761930522613_n.jpg'
我搜索了其他问题,但没有解决这个问题

该表单是表单valid上的经典one simpy save实例

class NewStudent(View):

    student_form = modelform_factory(Student,exclude=())

    def get(self, request,pk=None):

        stu=self.student_form() 
        return render(request,'school/student_new.html',{'form1': stu)
    def post(self, request):

        stu=self.student_form(request.POST,request.FILES)

        if stu.is_valid() :
            studentvar=stu.save()

            return redirect(to='student_detail',pk=studentvar.pk)

        return render(request,'school/student_new.html',{'form1': stu)
使用在tmp目录上创建的套接字执行会导致问题

我通过移动套接字文件修复了此问题:

从/tmp/djangoche.socket到/var/www/pr5/server.socket

WSGI和uWSGI配置案例出现问题

如果没有修复,您还可以尝试此方法

对于cherokee服务器,仅在cherokee Administration中取消选中处理WSGI或类似文件的虚拟服务器的Check文件,这适用于基于文件的脚本,如php,并且在我们的案例中会导致很多问题。 此选项位于“通用CGI选项”部分的“处理程序”选项卡下

第二个选项与第一个修复程序一起使用,添加到WSGI.py文件:

导入系统 sys.path.append'/path/to/project' sys.path.append'/path/to/project/projectname'

class NewStudent(View):

    student_form = modelform_factory(Student,exclude=())

    def get(self, request,pk=None):

        stu=self.student_form() 
        return render(request,'school/student_new.html',{'form1': stu)
    def post(self, request):

        stu=self.student_form(request.POST,request.FILES)

        if stu.is_valid() :
            studentvar=stu.save()

            return redirect(to='student_detail',pk=studentvar.pk)

        return render(request,'school/student_new.html',{'form1': stu)