@zlodiak

Как сделать редирект из контроллера в контроллер?

У меня есть простейшая админка с регистрацией и аутентификацией. Аутентификация находится в отдельном контроллере auth_request(). Я хотел бы чтобы после регистрации сразу происходила аутентификация.

Чтобы не писать повторяющийся код я решил сделать редирект из контроллера регистрации в контроллер аутентификации. Важно чтобы при этом сохранились все переданные через форму регистрации POST-данные. Вот моя попытка:

@app.route('/auth_request', methods=['POST'])
def auth_request():
    print('------------- auth req starts')
    with DB_connection() as db_connect:
        db_cursor = db_connect.cursor()

        pasword = request.values.get('password')
        password_hash = hashlib.sha1(pasword.encode('ASCII')).hexdigest()
        email = request.values.get('email')
        req = "select * from users where password_hash='" + password_hash + "' and email='" + email + "' and active=TRUE"

        try:
            db_cursor.execute(req)
            user = db_cursor.fetchone() 
            resp = Response('authorized')
            resp.headers['Set-Cookie'] = 'flask_adminka_authorized_user_id=' + str(user[0])
            return resp
        except:
            resp = Response('not authorized')
            return resp


@app.route('/registration_request', methods=['POST'])
def registration_request():
    with DB_connection() as db_connect:
        db_cursor = db_connect.cursor()

        pasword = request.values.get('password')
        password_hash = hashlib.sha1(pasword.encode('ASCII')).hexdigest()
        email = request.values.get('email')
        req = "insert into users(password_hash, email, active) values('" + password_hash + "', '" + email + "', 'TRUE')"

        try:
            db_cursor.execute(req)
            redirect(url_for('auth_request'), code=307)
        except:
            resp = Response('registration is failed')
            return resp


В результате после того как пользователь отправляет форму регистрации, в консоль выводится такая ошибка:
^C(flask_adminka) md@md ~/.MINT18/code/python/flask_adminka $ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [07/Dec/2019 17:08:13] "GET /registration HTTP/1.1" 200 -
[2019-12-07 17:08:16,035] ERROR in app: Exception on /registration_request [POST]
Traceback (most recent call last):
  File "/home/md/.local/share/virtualenvs/flask_adminka-0m3aMTkE/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/md/.local/share/virtualenvs/flask_adminka-0m3aMTkE/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    return self.finalize_request(rv)
  File "/home/md/.local/share/virtualenvs/flask_adminka-0m3aMTkE/lib/python3.8/site-packages/flask/app.py", line 1967, in finalize_request
    response = self.make_response(rv)
  File "/home/md/.local/share/virtualenvs/flask_adminka-0m3aMTkE/lib/python3.8/site-packages/flask/app.py", line 2096, in make_response
    raise TypeError(
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.
127.0.0.1 - - [07/Dec/2019 17:08:16] "POST /registration_request HTTP/1.1" 500 -


Помогите пожалуйста сделать так чтобы после регистрации происходила аутентификация.

Полный код тут.

PS:
Сейчас аутентификация отдельно работает без проблем
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 1
@antonksa
Вам же на русском языке фласк написал - "неплохо было бы добавить return, хозяина-ма".
try:
    db_cursor.execute(req)
    return redirect(url_for('auth_request'), code=307)
except:
    return Response('registration is failed')


redirect() это ФУНКЦИЯ, которая возвращает объект КЛАССА Response, просто специфический, с кодом и заголовками. Но он ушел в нихиль, потому что вы его не вернули из вызова. Вы вообще руками могли его сформировать. Любой код в контроллере должен в итоге вернуть Response или выбросить эксцепшн, который фласк умеет обрабатывать.

И еще, Вы НЕ делаете редирект из контроллера в контроллер. Вы ВОЗВРАЩАЕТЕ ПОЛЬЛЬЗОВАТЕЛЮ ответ на запрос, в котором упаковано предложение на редирект. У него может они вообще отключены.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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