4

メッセージが届きます

[Errno 13] djangoでファイルをアップロードしようとすると、許可が拒否されました:u'/ home/.../...jpg'。しかし、問題はlocalhost/で試してみた場合にのみ発生します。localhost:8000で実行またはデバッグすると、問題は発生しません。

スクリプトを実行してデータベースを設定するときに、関数を使用してフォルダーを作成します。

私のコード:

def handle_uploaded_file(request,f):
    user=Users.objects.get(id_u=request.user.id)
    url=settings.MEDIA_URL+'images/'+user.mail+'/gallery/'+f.name
    fullurl=settings.MEDIA_ROOT+'images/'+user.mail+'/gallery/'+f.name
    #comprobar si existe el archivo
    if not os.path.exists(fullurl): 
        destination = open(fullurl, 'wb+') 
    ...
        destination.close()

フォルダメディアの権限。ファイルを「images」フォルダにアップロードしたい。ここでは、他のユーザーには書き込み権限がありませんが、upフォルダーには777があります。では、スクリプトがサブフォルダーを作成するときに、なぜスクリプトが権限を変更するのでしょうか。

4 drwxrwxrwx  3 bernardo www-data 4096 ago  3 09:42 .
4 drwxrwxr-x 11 bernardo www-data 4096 jul 31 12:36 ..
4 drwxrwxr-x  5 bernardo bernardo 4096 ago  3 09:42 images

私のhttp.config

ServerName localhost

WSGIPythonPath /home/bernardo/workspace/mbosoziales

Alias /media/ /home/bernardo/workspace/mbosoziales/media/
Alias /static/ /home/bernardo/workspace/mbosoziales/static/

<Directory /home/bernardo/workspace/mbosoziales/static>  
Order deny,allow
Allow from all
</Directory>

<Directory /home/bernardo/workspace/mbosoziales/media>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /home/bernardo/workspace/mbosoziales/mbosoziales/wsgi.py

<Directory /home/bernardo/workspace/mbosoziales/mbosoziales>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

したがって、ユーザーのフォルダーを作成する最初のスクリプトを実行した後は、メディアフォルダーに書き込むためのアクセス許可がないため、アクセス許可は正しいと思いますが、毎回変更する必要があります。

sudo chgrp -R www-data images/
chmod -R o+w images/

どんな助けでもいただければ幸いです。そして私の英語でごめんなさい:)

完全な例外を追加しました:環境:

Request Method: POST
Request URL: localhost:8000/user/upload/

Django Version: 1.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'admin',
 'login',
 'suchen',
 'user',
 'photologue')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in             get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
  20.                 return view_func(request, *args, **kwargs)
File "/home/bernardo/workspace/mbosoziales/user/views.py" in upload
  332.             handle_uploaded_file(request,request.FILES['file'])
File "/home/bernardo/workspace/mbosoziales/user/views.py" in handle_uploaded_file
  344.         destination = open(fullurl, 'wb+')

Exception Type: IOError at /user/upload/
Exception Value: [Errno 13] Permission denied: u'/home/bernardo/workspace    /mbosoziales    /media/images/bern@ardo.com/gallery/list.csv'
4

3 に答える 3

9

を使用するrunserverと、プロセスは通常のユーザーとして実行されます。このユーザーは、/home/username/フォルダとファイルを作成するためのアクセス権を持っています。

Apacheで実行すると、コードはapacheプロセスとして実行されます(通常はwww-data)。そのユーザーは、ホームディレクトリの下にフォルダーを作成するためのアクセス権を持っていません。

解決策は、これが機能していても解決しないchmod 777ことです。これにアプローチするための2つのより良い方法があります:

  1. 本番環境で使用する場合は、ファイルパスをwww-dataユーザーが通常権限を持つディレクトリに変更します。これはホームディレクトリであってはなりません。

  2. ホームディレクトリの下の場所を使用する必要がある場合。新しいパスを作成し、その親の所有者をに設定しwww-data:www-dataます。これにより、包括的な777権限を与えなくても機能するようになります。

于 2012-08-23T08:04:02.057 に答える
0

ここで作成したファイルが可能でしょうか。

destination = open(fullurl, 'wb+')

コードを実行しようとしたときに、すでに作成されて開いているか、どこかで使用されていますか?

于 2012-08-22T23:04:43.187 に答える
0

私が持っている前に

if not os.path.exists(fullurl):

したがって、ファイルがない場合にのみオープンが行われます。何度かデバッグして正常に動作しましたが、権限に問題があります。今のところ、私は回避策を見つけました

os.chmod(url,0777)

初めてサーバーを実行してフォルダーを作成するとき。

于 2012-08-23T07:13:10.270 に答える