Задать вопрос
@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'),

Но результат тотже
  • Вопрос задан
  • 1687 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 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 подставляет фреймворк, когда вызывает функцию или метод представления.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽