2015-06-19 8 views
12

में काम करता है मैं उपयोगकर्ताओं के लिए डिफ़ॉल्ट भूमिकाएं सेट अप करने के लिए उपयोगकर्ता_registered सिग्नल का उपयोग करने का प्रयास कर रहा हूं, जब वे निम्न लिंक में फ्लास्क-सुरक्षा का उपयोग करके पंजीकरण करते हैं: Setting Default Role in Flask Securityफ्लास्क-सुरक्षा उपयोगकर्ता_registered सिग्नल पायथन 3.3 में प्राप्त नहीं हुआ है, लेकिन 2.7

अपनी खोजों में मैं देख सकता हूँ एक बग कि पहले से ही कुप्पी के सुरक्षा में इस के लिए संबोधित किया था: Not getting signal from flask-security, Fix - user_registered signal problem

मैं अगर सिग्नल न होने हैंडलर द्वारा प्राप्त होता है साबित करने के लिए निम्नलिखित की कोशिश की है कोई भाग्य:

@user_registered.connect_via(app) 
def user_registered_sighandler(sender, **extra): 
    print("print-user_registered_sighandler:", extra) 

हालांकि, उपयोगकर्ता को पंजीकृत होने के बावजूद कभी भी कॉल नहीं किया जाता है और संकेत भेजा जाना चाहिए।

यह मदद करता है मैं कुप्पी के सुरक्षा विन्यास के रूप में इस सेट कर लिया है: कुप्पी के लॉगिन और कुप्पी के प्रधान मेरे लिए काम कर रहे हैं से

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 

सिग्नल के रूप में मैं इस बात की पुष्टि करने में कामयाब रहे कि निम्नलिखित कोड के टुकड़े को सफलतापूर्वक प्रिंट जब संकेत भेजा जाता है:

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

मेरी सेटअप मैं उपयोग कर रहा हूँ अजगर 3.3 (एनाकोंडा) और निम्न का उपयोग कर के लिए: बोतल == 0.10.1, कुप्पी के लॉगिन == 0.2.11, कुप्पी के प्रिंसिपल == 0.4.0, कुप्पी के सुरक्षा == 1.7.4, ब्लिंकर == 1.3। फ्लास्क-लॉगिन और फ्लास्क-सुरक्षा दोनों में सिग्नल को देखते हुए मुझे यकीन नहीं है कि फ्लास्क-सुरक्षा संकेत क्यों काम नहीं करेंगे।

संपादित करें:

अगर मैं अपने अनुप्रयोग में एक मार्ग के लिए print(user_registered.receivers) जोड़ने यह दिखा देंगे मैं एक रिसीवर है कि: {139923381372400: <function user_registered_sighandler at 0x7f42737145f0>}। अगर मैं सिर्फ user_registered.send(app._get_current_object(),user=user, confirm_token=token) से पहले कुप्पी के सुरक्षा की registerable.py भीतर यह एक ही प्रिंट बयान कर दिया तो यह कोई रिसीवर को सूचीबद्ध करता है: {}

EDIT2:

समस्या अजगर 3.3 का उपयोग कर से संबंधित प्रतीत होता है। मैंने एक पायथन 2.7 वातावरण बनाया और उपयोगकर्ता_registered कोड अपेक्षित के रूप में काम किया।

पूर्ण कोड पुन: पेश करने:

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 टेम्पलेट:

<!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> 

उत्तर

0

तो user_registered के लिए आयात निम्नलिखित में बदल दिया गया है:

from flask.ext.security import user_registered 

तो सिग्नल पायथन 3.3 में अपेक्षित के रूप में काम करेगा और उपयोगकर्ता पंजीकृत होने पर user_registered_sighandler फ़ंक्शन पर कॉल करेगा।

user_registered सिग्नल को फ्लास्क-सुरक्षा के लिए __init__.py फ़ाइल के भीतर आयात किया जाता है, इसलिए यह पैकेज के शीर्ष स्तर पर भी उपलब्ध है।

+0

अद्यतन: अब यह flask_security आयात उपयोगकर्ता_registered 'से है –

0

मैं की तरह कुछ के साथ ऐसा करने में सक्षम था:

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

उत्तर @ ब्रैंडनरोस के लिए धन्यवाद। हालांकि, यह मेरी समस्या का समाधान नहीं करता है। आप पाइथन और संबंधित मॉड्यूल का क्या संस्करण उपयोग कर रहे हैं? भले ही मैं एक विस्तारित रजिस्टर फॉर्म जोड़ूं और फ़ंक्शन पैरामीटर का उपयोग करता हूं जिसका आपने उपयोग किया है, मेरे फ़ंक्शन को कॉल नहीं किया जाता है। – khammel

+0

2.7, हालांकि इसे वापस देखकर, मैं वास्तव में आपके कोड में नहीं देख रहा हूं जहां आप डिफ़ॉल्ट भूमिका को परिभाषित करते हैं। यदि यह 2.7 में काम कर रहा है तो क्या आप ऐप चलाने के लिए 2.7 का उपयोग कर सकते हैं? यदि आप पर्यवेक्षक का उपयोग करते हैं तो आप केवल ऐप के लिए अपने पायथनपैथ को निर्दिष्ट कर सकते हैं, भले ही आप अन्य कार्यों के लिए पायथन 3 चला रहे हों। – brandomr

+0

डिफ़ॉल्ट भूमिका को परिभाषित करना मेरा मुद्दा नहीं था। समस्या यह थी कि संकेत कभी प्राप्त नहीं हुआ था। मैं एक कामकाज के रूप में peewee प्लेहाउस सिग्नल का उपयोग कर रहा हूँ। – khammel

संबंधित मुद्दे