سؤال

أنا باستخدام جانغوريستفراميورك لجعل أبي.حاليا لدي المصادقة أوث 2 العمل مما يعني أنني يمكن أن تولد رمز وصول صالح لاستخدام أبي.

كيف يمكنني تحميل ملف مستخدم?أحتاج إلى تحميل ملف وربطه بالمستخدم الذي قام بتحميله.

أحاول حاليا القيام بذلك بهذه الطريقة

api/views.py:

class FileUploadView(APIView):
    parser_classes = (FileUploadParser,)

    def put(self, request, filename, format=None):
        file_obj = request.FILES['file']
        # do stuff
        return Response(status=204)

api/urls.py يحتوي على هذا الخط:

url(r'^files/', 'api.views.FileUploadView'),

ولكن عندما أحاول تحميل ملف أحصل على خطأ تفيد بأن:

'CSRF verification failed. Request aborted'
'Reason given for failure: CSRF cookie not set'

عندما أحاول هذا الأمر حليقة:

curl -XPUT http://localhost:8000/files/ -H 'Authorization: Bearer some_access_token' -F filedata=@localfile.txt

ها هي الإعدادات الافتراضية لإطار العمل الخاص بي:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.OAuth2Authentication',
    )
}
هل كانت مفيدة؟

المحلول

1) في التعليمات البرمجية الأصلية كنت أتوقع معلمة اسم الملف إلى وجهة نظري ولكن لم أكن تحليل ذلك من ورل في urls.py.كان يجب أن يبدو شيئا من هذا القبيل:

url(r'^uploads/(?P<filename>[\w.]{0,256})/$', views.UploadsView.as_view()),

2) كنت أيضا لا توفر أبيفيو وجهة نظر.إذا لاحظت أعلاه ، فأنا أتصل على وجه التحديد بالطريقة .

مع ما سبق ثابتة وتنفيذ آخر بدلا من وضع قانون بلدي يعمل كما هو متوقع.هنا هو بلدي أبيفيو الحالي:

class UploadsView(APIView):

    parser_classes = (FileUploadParser,)
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, format=None):
        file_obj = request.FILES['file']
        print("FILE OBJ: ", file_obj)
        return Response(status=201)

نصائح أخرى

لكل وثائق Django Rest Frameworation ، "إذا كنت تستخدم SessionAuthentication، فستحتاج إلى تضمين رموز CSRF صالحة لأي منشور أو وضع أو تصحيح أو حذف عمليات.

من أجل تقديم طلبات AJAX، تحتاج إلى تضمين رمزية CSRF في رأس HTTP، كما هو موضح في وثائق django ."

بدلا من ذلك، يمكنك محاولة جعل هذا العرض معفاة CSRF :

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top