@Lepilov

Аргумент request в функциях Django?

Есть функция (не джанговская ) которая передает html файл на редактирование в google doc. Одним из параметров там идет email, которыый сейчас у меня захардкожен. На всякий приведу тело функции , хотя вопрос не в ней

def file_to_drive(import_file=None):
    credentials = service_account.Credentials.from_service_account_file(ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=credentials)
    file_metadata = {
        'name': 'CV:' + uuid.uuid4().hex,
        'mimeType': 'application/vnd.google-apps.document'
    }
    media = MediaFileUpload(import_file,
                            mimetype='text/html',
                            resumable=True)

    file = service.files().create(body=file_metadata,
                                        media_body=media,
                                        fields='id').execute()
    fileId = file.get('id')
    current_user()
    permission1 = {
        'type': 'user',
        'role': 'writer',
        'emailAddress': 'MY@EMAIL.com',
    }
    service.permissions().create(fileId=fileId, body=permission1).execute()
    permission2 = {
        'type': 'anyone',
        'role': 'writer',
    }
    service.permissions().create(fileId=fileId, body=permission2).execute()
    return (f"https://docs.google.com/document/d/{file.get('id')}/edit")


Я хочу получить адрес текущего юзера, для подмены им моего хардкода. Пробую стандартный подход

def current_user(request):
    CU = request.user
    print(CU.email)


И получаю

TypeError: current_user() missing 1 required positional argument: 'request'


И действительно откуда берется в джанговских вьюхах request и почему в моем случае его не хватает?
Я попробовал связать вьюху с url
path('current_user/', current_user, name='current_user'),

Но результат тотже
  • Вопрос задан
  • 1638 просмотров
Решения вопроса 2
@antonksa
Как-то слишком много магии...

Неужели вы не понимаете, что request не самозарождается внутри функции, как дети в капусте?!

1. При старте фреймворка джанга ищет все urls.py, вычитывает из них все urlpatterns.
2. После этого она сохраняет у себя во внутреннем реестре связку урл - функция.
3. Когда приходит запрос, WSGI вычитывает TCP данные, HTTP данные и формирует WSGIRequest объект всунув в него эту информацию и вызывает главный хендлер джанги.
4. Хендлер джанги получив этот объект формирует на его основе свой HttpRequest дополняя его джанговскими фичами. После этого находится соответствие урлу и функция обрабатывающаяя этот урл вызывается, с переданным в нее HttpRequest. И кстати не только request. Надо писать:
def handler(request, *args, **kwargs) -> HttpResponse:
    pass

потому что джанга может НЕ ТОЛЬКО REQUEST передать в функцию, будете потом тупить, "а почему у меня user_id пишет что не поместилось".

НЕЛЬЗЯ "№;%% В ВОЗДУХЕ НАПИСАТЬ blabla(request) И ЖДАТЬ ЧТО REQUEST САМОЗАРОДИТСЯ ИЗ НИЧЕГО!!!

И вообще, у меня сильное ощущение, что вам на три-четыре месяца надо отложить Django и выучить сам питон для начала...
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Параметр request подставляет фреймворк, когда вызывает функцию или метод представления.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы