2015-06-19 14 views
12

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> 

Trả lời

0

Nếu nhập khẩu đối với user_registered được thay đổi thành:

from flask.ext.security import user_registered 

thì tín hiệu sẽ hoạt động như mong đợi ở trăn 3.3 và gọi hàm user_registered_sighandler khi người dùng được đăng ký.

Tín hiệu user_registered được nhập trong tệp __init__.py để bảo mật bình để nó cũng có sẵn ở cấp cao nhất của gói.

+0

Cập nhật: bây giờ là 'từ flask_security import user_registered' –

0

tôi đã có thể làm điều này với một cái gì đó như:

security = Security(app, user_datastore, 
     register_form=ExtendedRegisterForm) 


@user_registered.connect_via(app) 
def user_registered_sighandler(app, user, confirm_token): 
    default_role = user_datastore.find_role("Pending") 
    user_datastore.add_role_to_user(user, default_role) 
    db.session.commit() 
+0

Cảm ơn câu trả lời @BrandonRose. Tuy nhiên, điều này không giải quyết được vấn đề của tôi. Phiên bản nào của python và các mô-đun liên quan bạn đang sử dụng? Ngay cả khi tôi thêm một mẫu đăng ký mở rộng và sử dụng các tham số chức năng bạn đã sử dụng chức năng của tôi không được gọi. – khammel

+0

2.7, mặc dù nhìn lại nó, tôi thực sự không nhìn thấy trong mã của bạn, nơi bạn xác định vai trò mặc định. Nếu nó hoạt động ở 2.7, bạn có thể sử dụng 2,7 để chạy ứng dụng không? Nếu bạn sử dụng supervisord, bạn có thể chỉ định pythonpath của bạn chỉ cho ứng dụng, ngay cả khi bạn đang chạy python 3 cho các nhiệm vụ khác. – brandomr

+0

Xác định vai trò mặc định không phải là vấn đề của tôi. Vấn đề là/là tín hiệu chưa bao giờ nhận được. Tôi đã sử dụng các tín hiệu playhouse peewee như một cách giải quyết. – khammel

Các vấn đề liên quan