일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 카톡
- NeXT
- 채팅
- AWS
- git
- pandas
- socket io
- 튜플
- MongoDB
- Class
- async
- S3
- Props
- wetube
- crud
- node
- Vue
- EC2
- 중급파이썬
- SSA
- SAA
- RDS
- lambda
- merge
- 파이썬
- react
- flask
- TypeScript
- docker
- dict
- Today
- Total
초보 개발자
간단 flask 초기 셋팅, 데코레이터, login_required 본문
지금까지 우리는 app.py라는 파일을 만들고 app = Flask(__name__)을 전역객체로 생성하여 if __name__ == __main__: app.run()을 통해 서버를 실행 시켰다. 그리고 app객체를 사용해 여러 설정을 진행한다. 그런데 이와 같은 방식으로 app 객체를 전역으로 사용하면 프로젝트 규모가 커질수록 문제가 발생할 확률이 높아진다고 한다.
플라스크 공식 홈페이지에서는 "애플리케이션 팩토리(application factory)를 사용하라"고 권한다. 애플리케이션 팩토리는 쉽게 말해 app 객체를 생성하는 함수를 의미한다.
폴더를 하나 만들고 그 안에 __init__py라는 파일을 생성해준다. 그리고 create_app()이라는 함수를 만들고 그 안에서 app을 정의한 뒤 app을 return해주자.
이렇게 한 뒤 터미널에서 flask run을 실행시켜보자
아마 오류가 날 것이다. 우리는 flask의 app이름을 지정해주어야 한다.
현재 내가 있는 폴더를 A라고하고 __init__.py가 있는 폴더를 B라고 하면
A에서 set FLASK_APP=B라고 해주어야 한다. 이제서야 flaks는 B모듈 __init__.py를 가리킨다. (__init__.py는 누구보다 빨리 실행되기 때문)
단!! flask run 명령은 반드시 A폴더에서 실행시켜야 한다. 다른 곳에서 실행하면 실행은 되지만 정상으로 동작하지 않는다. 앞으로도 서버를 실행할 때는 위치를 꼭 확인하자.
app설정을 이 안에서 바꿔주었더니 app이 실행이 된 후에 바뀐다. 다시말해서 debug는 false인 상태에서 실행이 되어 false인 상태 그대로다. 이것 역시 set FLASK_DEBUG=True 라고 터미널에서 실행해주면 잘 실행이 된다.
단!! 함수명으로 create_app 대신 다른 이름을 사용하면 정상으로 동작하지 않는다. create_app은 플라스크 내부에서 정의된 함수명이다.
이렇게 실행을 시켜준 뒤 블루프린터를 사용해서 라우터를 지정해주려고 한다.
B폴더에서 views라는 폴더를 만든 뒤 main_views.py라는 파일을 만들고 그 안에 이렇게 적어보자
Blueprint객체를 만들어서 라우터를 사용하는 것 같다.
애너테이션이 @app.route이 아닌 @bp.route로 변경로 적어주어야 한다. 이 변화에 주목하자. @bp.route에서 bp는 Blueprint 클래스로 생성한 객체를 의미한다. 코드에서 보듯 Blueprint 클래스로 객체를 생성할 때는 'main'(이름), __name__(모듈명), url-prefix='/'(URL 프리픽스) 값을 전달해야 한다. 만약 프리픽스를 /hi 라고 설정하면
bp.route('/')는 기본적으로 /hi를 의미한다. 따라서 bp.route('/bye')는 localhost:5000/hi/bye라고 입력을해야 저 함수가 실행이 될 것이다. 블루프린트 객체의 이름인 'main'은 나중에 함수명으로 URL을 찾아주는 url_for 함수에서 사용된다.
main.home 이런식!!
저 파일을 import해와서 app.register_blueprint(파일이름.bp)를 적어주시면 된다.
근데 저 from앞에 .을 생략해주시면 안된다!! 오류가난다.
데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용된다.
trace라는 함수는 함수를 매개변수로 받고, (파이썬은 객체 지향이기때문에 가능) 함수 안에서 함수를 정의하여 그 만든 함수를 리턴해주었다. 내부에서 만든 함수에는 매개변수로 받아온 함수를 실행시킨다.
trace_hello = trace(hello)trace_hello()이 부분이 실행되면 func.__name__에 hello가 들어가 있는 걸 알 수 있다.
실제 리턴받은 trace_hello안에 func()는 이미 없는데도 잘 hello()함수가 실행이 된다. 여기서 클로저의 개념이 나온다. 이 부분은 유튜브에서 찾아보자
@으로 데코레이터를 사용할 수 있다.
이러한 로직으로 흘러가는 걸 알 수 있다.
flask에서 내가 잘못쓴건지는 모르겠지만 @wraps어노테이션을 쓰면 오류가 안나고 안쓰면 오류가 났다..
이부분에 대해선 잘 모르겠다. 나는 로그인 유무를 파악하기 위해서 아래와 같이 코드를 구성했다.
return을 안쓰고 f(*args)만 적었더니 오류가 났다. return을 꼭 적어주자. 이렇게 해서
로그인이 필요할 때(글 보기, 글 쓰기, 등에서는) login_required 데코레이터를 달아주고
로그아웃이 필요할 때(로그인창, 회원가입창)는 logout_required 데코레이터를 달아주었다.
여기서 login_required는 토큰이 있다면 except문으로 빠져나가지 않고 return f(*args)가 실행이 될 것이다.
반대로 logout_required는 토큰이 있다면 redirect로 /를 가게 해준다. 토큰이 없을 경우에만 f(*args)가 실행이 될 것이다.
return에 wrapper()이라고 적어서 2시간동안 오류와 싸운 적이 있다.. wrapper라고만 잘 적어주자
이와 같이 쓸 수 있다. @login_required를 @bp.route('/')위에 적어주면 안된다.
'AI 웹개발 트랙 - 내배캠 > 4주차' 카테고리의 다른 글
np.random.seed(int) (0) | 2022.01.06 |
---|---|
df drop (0) | 2022.01.06 |
flask 이미지 업로드 방식 3 aws s3사용 (0) | 2022.01.05 |
flask 이미지 업로드 방식 2 gridfs사용 (1) | 2022.01.05 |
flask config 진짜 기본적인 내용 (0) | 2022.01.04 |