강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của dhnp68030031
dhnp68030031

câu hỏi đã được viết

Tạo website thực tế với Python của Tiến sĩ Nam

Đóng gói dự án Flask bằng cách mô-đun hóa

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

Viết

·

945

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")

python

Câu trả lời 6

1

nambaksa님의 프로필 이미지
nambaksa
Người chia sẻ kiến thức

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

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

1

안녕하세요 남박사님,

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

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

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

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

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

헛, 감사합니다 ㅎ

1

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

1

nambaksa님의 프로필 이미지
nambaksa
Người chia sẻ kiến thức

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

__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

nambaksa님의 프로필 이미지
nambaksa
Người chia sẻ kiến thức

__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

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

똑같은 에러인데

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

Hình ảnh hồ sơ của dhnp68030031
dhnp68030031

câu hỏi đã được viết

Đặt câu hỏi