인프런 커뮤니티 질문&답변

Chocoder님의 프로필 이미지
Chocoder

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

플라스크 프로젝트를 모듈화 하여 패키징 하기

안녕하세요. 모듈에서 오류가 자꾸뜨네요!

작성

·

768

1

강의를 똑같이 따라해봤는데요. 오류가 뜨네요..ㅜㅠ 

from main import * 를 했는데, app 이 undefined 라고 합니다..!

pylint install도 해봤고, 아예 import를 따로도 해봤는데 같은 문제가 발생하네요!

어떻게 해결할 수 있을까요??

구글에서는 보통 app을 import하지 않고 먼저 사용했을 때 이런 오류가 발생한다고 하는데, from main import *로 app을 분명히 정의한 것 같은데 왜 안되는지 모르겠습니다.

(참고로 @ 와 app 사이에 띄어쓰기는 다시 붙였습니다!)

아래는 제 코드 붙여놓겠습니다!

에러는 다음과 같습니다.

 

init.py

from . import member
from . import board
from .filter import format_datetime
from .common import login_required
from flask import Flask, request, render_template, abort, url_for
from flask import redirect
from flask import flash, session
from flask_pymongo import PyMongo
from datetime import datetime, timedelta
from bson.objectid import ObjectId
import time
import math


app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb"
app.config["SECRET_KEY"] = "abcd"
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30)
mongo = PyMongo(app)

run.py

from main import app

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=9000)

member.py

from main import *


@app.route("/join", methods=["GET", "POST"])
def member_join():
    if request.method == "POST":
        name = request.form.get("name", type=str)
        email = request.form.get("email", type=str)
        pass1 = request.form.get("pass", type=str)
        pass2 = request.form.get("pass2", type=str)

        if name == "" or email == "" or pass1 == "" or pass2 == "":
            flash("입력되지 않은 값이 있습니다.")
            return render_template("join.html")

        if pass1 != pass2:
            flash("비밀번호가 일치하지 않습니다.")
            return render_template("join.html")

        members = mongo.db.members
        cnt = members.find({"email": email}).count()
        if cnt > 0:
            flash("중복된 이메일 주소입니다.")
            return render_template("join.html")

        current_utc_time = round(datetime.utcnow().timestamp() * 1000)
        post = {
            "name": name,
            "email": email,
            "pass": pass1,
            "joindate": current_utc_time,
            "logintime": "",
            "logincount": 0,
        }

        members.insert_one(post)
        return ""
    else:
        return render_template("join.html")


@app.route("/login", methods=["GET", "POST"])
def member_login():
    if request.method == "POST":
        email = request.form.get("email")
        password = request.form.get("pass")
        next_url = request.form.get("next_url")

        members = mongo.db.members
        data = members.find_one({"email": email})

        if data is None:
            flash("회원 정보가 없습니다.")
            return redirect(url_for("member_login"))
        else:
            if data.get("pass") == password:
                session["email"] = email
                session["name"] = data.get("name")
                session["id"] = str(data.get("_id"))
                session.permanent = True
                if next_url is not None:
                    return redirect(next_url)
                else:
                    return redirect(url_for("lists"))
                return redirect(url_for("lists"))
            else:
                flash("비밀번호가 일치하지 않습니다.")
                return redirect(url_for("member_login"))
        return ""
    else:
        next_url = request.args.get("next_url", type=str)
        if next_url is not None:
            return render_template("login.html", next_url=next_url)
        else:
            return render_template("login.html")

답변 6

1

남박사님의 프로필 이미지
남박사
지식공유자

vscode 설정의 문제였군요. 그래도 찾아내신게 대단하십니다!!!

다른 분들께도 도움이 되셨으면 좋겠습니다. ^^

1

안녕하세요 남박사님,

남박사님이 올려주신 수업 자료와 대조해가며 원인을 찾아내었습니다.

vscode settings에서 format on save 체크가 되어 있는 관계로 __init__.py 파일의 위 4개 라인을 타이핑 후 저장하면 자꾸 맨 위로 올려버리는 현상 때문에 에러가 발생하는 것이었습니다.

아마 다른 분들도 이와 같은 경우를 많이 접하셨을 것 같습니다. 저 체크를 해제 후 저장하면 위 4개 라인이 위로 올라가지 않고 그대로 저장되며 run.py의 실행도 문제없이 이루어짐을 확인하였습니다.

님 천재입니다. 이걸 어떻게 알아내셨을까요. 정말 아무리 검색하고 물어봐도

안아오던데 ,  대단하십니다.

헛, 감사합니다 ㅎ

1

저도 동일한 증상인데 해결방안 아시는 분 답변 부탁드립니다~

1

남박사님의 프로필 이미지
남박사
지식공유자

그런 임포트 오류가 발생했을때는 코드를 다 작성하지 마시고

__init__.py 에는

app = Flask(__name__)

run.py 에는

from main import app

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=9000)

이렇게만 코드를 작성해서 실행해보시고 문제가 없으면 하나하나 import 를 추가하면서 어디서 문제가 발생하는지 확인해보시는게 추후를 위해서도 좋을것 같습니다.

0

남박사님의 프로필 이미지
남박사
지식공유자

__init__.py  파일에서

from main import member
from main import board
from main.filter import format_datetime
from main.common import login_required

import 문을 위와 같이 수정해보시고 아니면 import 의 순서를 바꿔보시고

그래도 오류가 발생하면 작성하신 코드를 한번 올려 주시기 바랍니다.

https://we.tl/t-SljyAeFGNN

위 링크는 제가 방금 제 컴퓨터에서 테스트 했을때 아무런 문제가 없던 코드인데 참고해보시기 바랍니다.

0

질문자님 이거 어떻게 해결 하셨나요?

똑같은 에러인데

도저히 해결이 안되네요..

Chocoder님의 프로필 이미지
Chocoder

작성한 질문수

질문하기