Tôi đang cố gắng sử dụng tín hiệu user_registered để thiết lập vai trò mặc định cho người dùng khi họ đăng ký sử dụng bình bảo mật như trong liên kết sau: Setting Default Role in Flask SecurityFlask-Security user_registered Tín hiệu không nhận được bằng Python 3.3, nhưng hoạt động ở 2,7
trong tìm kiếm của tôi, tôi có thể thấy rằng có một lỗi đó đã được giải quyết cho điều này trong bình-an ninh: Not getting signal from flask-security, Fix - user_registered signal problem
tôi đã thử những điều sau đây để chứng minh nếu tín hiệu được nhận bởi bộ xử lý mà không cần bất kỳ may mắn nào:
@user_registered.connect_via(app)
def user_registered_sighandler(sender, **extra):
print("print-user_registered_sighandler:", extra)
Điều này, tuy nhiên, không bao giờ được gọi ngay cả khi người dùng được đăng ký và tín hiệu sẽ được gửi đi.
Nếu nó giúp tôi đã thiết lập các cấu hình bình-an ninh như sau:
app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = False
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
app.config['SECURITY_CHANGEABLE'] = True
app.config['SECURITY_SEND_PASSWORD_CHANGE_EMAIL'] = False
Tín hiệu từ Flask-Login và Flask-Principal đang làm việc cho tôi khi tôi cố gắng xác nhận rằng các đoạn mã sau thành công in khi các tín hiệu được gửi:
@user_logged_out.connect_via(app)
def on_user_logged_out(sender, user):
print('USER LOG OUT: made it in',user)
@identity_changed.connect_via(app)
def identity_changed_ok(sender,identity):
print('Identity changed:',identity)
Đối với thiết lập của tôi, tôi đang sử dụng python 3.3 (Anaconda) và sử dụng như sau: flask == 0.10.1, bình đăng nhập == 0.2.11, bình-yếu == 0,4,0, bình an toàn == 1,7,4, blinker == 1.3. Nhìn vào các tín hiệu trong cả hai bình-đăng nhập và bình an ninh, tôi không chắc tại sao các tín hiệu an toàn bình sẽ không hoạt động.
EDIT:
Nếu tôi thêm print(user_registered.receivers)
đến một tuyến đường trong ứng dụng của tôi nó sẽ hiển thị rằng tôi có một người nhận: {139923381372400: <function user_registered_sighandler at 0x7f42737145f0>}
. Nếu tôi đặt câu lệnh print cùng này trong registerable.py của bình-an ninh ngay trước khi user_registered.send(app._get_current_object(),user=user, confirm_token=token)
sau đó nó liệt kê không có người nhận: {}
EDIT2:
Vấn đề dường như liên quan đến sử dụng python 3.3. Tôi đã tạo môi trường python 2.7 và mã user_registered hoạt động như mong đợi.
Full mã để tái sản xuất:
from flask import Flask,render_template
from playhouse.flask_utils import FlaskDB
import os
from flask.ext.security import Security, PeeweeUserDatastore
from flask.ext.security.signals import user_registered
from flask.ext.login import user_logged_out
from peewee import *
from playhouse.signals import Model
from flask.ext.security import UserMixin,RoleMixin
app = Flask(__name__)
app.config['ADMIN_PASSWORD']='secret'
app.config['APP_DIR']=os.path.dirname(os.path.realpath(__file__))
app.config['DATABASE']='sqliteext:///%s' % os.path.join(app.config['APP_DIR'], 'blog.db')
app.config['SECRET_KEY'] = 'shhh, secret!'
app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = False
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
flask_db = FlaskDB()
flask_db.init_app(app)
database = flask_db.database
class BaseModel(Model):
class Meta:
database=flask_db.database
class User(BaseModel, UserMixin):
email=CharField()
password=CharField()
active = BooleanField(default=True)
confirmed_at = DateTimeField(null=True)
def is_active(self):
return True
def is_anonymous(self):
return False
def is_authenticated(self):
return True
class Role(BaseModel, RoleMixin):
name = CharField(unique=True)
description = TextField(null=True)
class UserRoles(BaseModel):
user = ForeignKeyField(User, related_name='roles')
role = ForeignKeyField(Role, related_name='users')
name = property(lambda self: self.role.name)
description = property(lambda self: self.role.description)
user_datastore = PeeweeUserDatastore(database, User, Role, UserRoles)
security = Security(app, user_datastore)
@user_registered.connect_via(app)
def user_registered_sighandler(sender,**extra):
print("print-user_registered_sighandler")
@user_logged_out.connect_via(app)
def on_user_logged_out(sender, user):
print('USER LOG OUT: made it in',user)
@app.route('/')
def index():
print(user_registered.receivers)
return render_template('base.html')
database.create_tables([User,Role,UserRoles], safe=True)
app.run(debug=True)
base.html mẫu:
<!doctype html>
<html>
<head>
<title>Blog</title>
</head>
<body>
<ul>
{% if current_user.is_authenticated() %}
<li><a href="{{ url_for('security.logout',next='/') }}">Log out</a></li>
<li><a href="{{ url_for('security.register') }}">Register</a></li>
{% else %}
<li><a href="{{ url_for('security.login',next='/') }}">Login</a></li>
<li><a href="{{ url_for('security.register') }}">Register</a></li>
{% endif %}
{% block extra_header %}{% endblock %}
</ul>
</body>
</html>
Cập nhật: bây giờ là 'từ flask_security import user_registered' –