cuốn sách gpt4 ai đã làm

Bình - Không thể sử dụng các phiên bản Flask và Flask-mail từ các tệp khác

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 08:40:50 29 4
mua khóa gpt4 Nike

Tôi hiện đang xây dựng một ứng dụng bằng Flask. Tôi đang cố gắng truy cập "ứng dụng" phiên bản Flask cũng như "thư" phiên bản Flask-mail.

Đây là dự án của tôi trông như thế nào:

└── dự án của tôi
├── ứng dụng
│ ├── __init__.py
│ ├── quản trị viên
│ │ ├── __init__.py
│ │ ├──forms.py
│ │ └── lượt xem
│ ├── xác thực
│ │ ├── __init__.py
│ │ ├──forms.py
│ │ └── lượt xem
│ │ └── token.py
│ │ └── email.py
│ ├── nhà
│ │ ├── __init__.py
│ │ └── lượt xem
│ ├── models.py
│ ├── tĩnh
│ └── mẫu
│ └──....

├── config.py
├── ví dụ
│ └── config.py
├── di chuyển
│ ├── ĐỌC
│ ├── alembic.ini
│ ├── env.py
│ ├── script.py.mako
│ └── phiên bản
│ └── a1a1d8b30202_.py
├── yêu cầu.txt
└── run.py

Các phiên bản Flask được tạo bằng hàm create_app trong run.py (từ

run.py

hệ điều hành nhập khẩu

từ nhập ứng dụng create_app

config_name = os.getenv('FLASK_CONFIG')
ứng dụng = create_app(config_name)

nếu __name__ == '__main__':
ứng dụng.run()

ứng dụng/__init__.py

# hàng nhập khẩu của bên thứ ba
từ bình nhập Flask, render_template
từ jar_sqlalchemy nhập SQLAlchemy
từ jar_login nhập Trình quản lý đăng nhập
từ jar_migrate nhập Di chuyển
từ jar_bootstrap nhập Bootstrap
từ thư nhập jar_mail
sọc nhập khẩu


# nhập khẩu nội địa
từ cấu hình nhập app_config

# khởi tạo biến db
db = SQLAlchemy()
login_manager=Trình quản lý đăng nhập()
Trình quản lý đăng nhập.user_loader

chắc chắn create_app(config_name):
ứng dụng = Bình(__name__, instance_relative_config=True)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')


Khởi động(ứng dụng)
db.init_app(ứng dụng)
login_manager.init_app(ứng dụng)
thư = Thư(ứng dụng)
di chuyển = Di chuyển(app,db)

từ các mô hình nhập ứng dụng

từ .admin nhập quản trị viên dưới dạng admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
#phần còn lại của quá trình nhập bản thiết kế sẽ ở đây


trả lại ứng dụng

Điều tôi muốn làm là sử dụng "Ứng dụng" và "Thư". Ví dụ: trong ứng dụng/auth/mã thông báo:

ứng dụng/auth/token.py

từ URL nhập nguy hiểm của nóSafeTimedSerializer

từ .import auth

def generate_confirmation_token(email):
serializer = URLSafeTimedSerializer(app.config['SECRET_KEY'])
trả về serializer.dumps(email, salt=app.config['SECURITY_PASSWORD_SALT'])

def confirm_token(mã thông báo, hết hạn = 600):
serializer = URLSafeTimedSerializer(app.config['SECRET_KEY'])
thử:
email = serializer.loads(
mã thông báo,
salt=app.config['SECURITY_PASSWORD_SALT'],
max_age=hết hạn
)
ngoại trừ:
trả về Sai
trả lại email

Hoặc trong ứng dụng/auth/email.py:

ứng dụng/auth/email.py

từ tin nhắn nhập jar_mail

từ .import auth

def send_mail(tới, chủ đề, mẫu):
tin nhắn = Tin nhắn(
subject,
người nhận=[đến],
html=mẫu,
người gửi=app.config['MAIL_DEFAULT_SENDER']
)
thư.send(tin nhắn)

Tôi cần hai chức năng này trong application/aut/views.py

ứng dụng/auth/views.py

từ flash nhập bình, chuyển hướng, render_template, url_for, yêu cầu
từ jar_login nhập login_required, login_user, logout_user
từ werkzeug.security nhập check_password_hash
nhập ngày giờ

từ .import auth
từ biểu mẫu nhập Biểu mẫu đăng nhập, Biểu mẫu đăng ký
từ .. nhập db
từ ..models người dùng nhập khẩu

@auth.route('/register', Method=['GET', 'POST'])
đăng ký def():
"""
Xử lý các yêu cầu tới tuyến /register
Thêm người dùng vào cơ sở dữ liệu thông qua mẫu đăng ký
"""
biểu mẫu = Đăng kýForm()
form.id = 'form_signup'
nếu form.validate_on_submit():
người dùng = Người dùng(email=form.email.data,
#tên người dùng=form.tên người dùng.data,
first_name=form.first_name.data,
Last_name=form.last_name.data,
mật khẩu=form.password.data,
đã đăng ký_on=datetime.datetime.now(),
đã xác nhận=Sai,
phí bảo hiểm=Sai)

# thêm nhân viên vào cơ sở dữ liệu
db.session.add(người dùng)
db.session.commit()
flash("Chúng tôi vừa gửi cho bạn email xác nhận. Vui lòng kích hoạt tài khoản của bạn để hoàn tất đăng ký", 'thành công')

mã thông báo = generate_confirmation_token(user.email)
confirm_url = url_for('auth.confirm_email', token=token, _external=True)
html = render_template('auth/activate.html', confirm_url=confirm_url)
topic = "Xin vui lòng xác nhận email của bạn"
send_email(user.email, chủ đề, html)

login_user(người dùng)

flash('Email xác nhận đã được gửi qua email.', 'thành công')

# chuyển hướng đến trang đăng nhập
#chuyển hướng quay lại(url_for('auth.login'))
trả về chuyển hướng(url_for('home.homepage'))

# tải mẫu đăng ký
trả về render_template('auth/register.html', form=form, title='Register')

@auth.route('/confirm/')
@login_required
xác nhận xác nhận_email(mã thông báo):
thử:
email = confirm_token(mã thông báo)
ngoại trừ:
flash('Liên kết xác nhận không hợp lệ hoặc đã hết hạn.', 'nguy hiểm')
user = User.query.filter_by(email=email).first_or_404()
nếu người dùng xác nhận:
flash('Tài khoản đã được xác nhận. Vui lòng đăng nhập.', 'thành công')
khác:
user.confirmed = Đúng
user.confirmed_on = datetime.datetime.now()
db.session.add(người dùng)
db.session.commit()
flash("Bạn đã xác nhận tài khoản của mình. Cảm ơn!", 'thành công')
quay lại chuyển hướng(url_for('auth.login'))

Điều tôi nhận được là lỗi "ứng dụng tên toàn cầu không được xác định" hoặc "thư tên toàn cầu không được xác định". Tôi đã cố gắng nhập biến bằng cách sử dụng ứng dụng nhập từ ứng dụng và nó trả về lỗi nhập "Không thể nhập ứng dụng"

cảm ơn sự hỗ trợ của bạn

câu trả lời hay nhất

Vì bạn đang sử dụng một nhà máy ứng dụng nên bạn cần sử dụng .init_app Bình thư Tham gia lớp học như bạn đã làm Flask-SQLAlchemy类(class)。 từ ứng dụng nhập ứng dụngsẽ không hoạt động vì khi gọi tạo_app Trước đây, bạn chưa bao giờ khởi tạo phiên bản ứng dụng bình của mình. hiện hữu run.py đóng một vai trò trong

ứng dụng/__init__.py

từ thư nhập jar_mail

thư = Thư()


chắc chắn create_app(config_lvl):
#chất liệu

thư.init_app(ứng dụng)
# nhiều thứ khác
trả lại ứng dụng

您也可以使用 hiện tại_appMiễn là khối mã bạn sử dụng chạy trong ứng dụng Flask, bạn có thể tham chiếu phiên bản ứng dụng thay vì chính phiên bản đó. Herelà một lời giải thích sâu sắc hơn.

ứng dụng/auth/email.py

từ ứng dụng nhập thư # bây giờ bạn có thể nhập đối tượng Mail()
từ tin nhắn nhập jar_mail
từ jar import current_app # sử dụng thông tin này để tham khảo bối cảnh ứng dụng hiện tại

def send_email(đến, chủ đề, mẫu):
tin nhắn = Tin nhắn(
subject,
người nhận=[đến],
html=mẫu,
người gửi=current_app.config['MAIL_DEFAULT_SENDER']
)
thư.send(tin nhắn)

ứng dụng/auth/token.py

từ URL nhập nguy hiểm của nóSafeTimedSerializer
từ bình nhập current_app

def generate_confirmation_token(email):
serializer = URLSafeTimedSerializer(current_app.config['SECRET_KEY'])
trả về serializer.dumps(email, salt=current_app.config['SECURITY_PASSWORD_SALT'])

def confirm_token(mã thông báo, hết hạn = 600):
serializer = URLSafeTimedSerializer(current_app.config['SECRET_KEY'])
thử:
email = serializer.loads(
mã thông báo,
salt=current_app.config['SECURITY_PASSWORD_SALT'],
max_age=hết hạn
)
ngoại trừ:
trả về Sai
trả lại email

Cũng lưu ý rằng bạn không cần từ .import authhiện hữu xác thực trong bất kỳ mô-đun nào dưới lượt xem.py bản thiết kế bên ngoài

biên tập

Lưu ý phụ: Bạn không phải thêm người dùng vào phiên vì nó đã được thêm khi bạn truy vấn nó trước đó trong tuyến. Bản thân tôi đã không nhận ra điều này trong một thời gian dài.

@auth.route('/confirm/')
@login_required
xác nhận xác nhận_email(mã thông báo):
thử:
email = confirm_token(mã thông báo)
ngoại trừ:
flash('Liên kết xác nhận không hợp lệ hoặc đã hết hạn.', 'nguy hiểm')
user = User.query.filter_by(email=email).first_or_404()
nếu người dùng xác nhận:
flash('Tài khoản đã được xác nhận. Vui lòng đăng nhập.', 'thành công')
khác:
user.confirmed = Đúng
user.confirmed_on = datetime.datetime.now()
# db.session.add(user) # có thể xóa cái này
db.session.commit()
flash("Bạn đã xác nhận tài khoản của mình. Cảm ơn!", 'thành công')
quay lại chuyển hướng(url_for('auth.login'))

Về python - Flask - không thể sử dụng các phiên bản Flask và Flask-mail từ các tệp khác, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/45026990/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress