python हेरोको पर अजगर bcrypt पैकेज AttributeError देता है: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'एफएफआई'




heroku flask (3)

Bcrypt == 3.1.2 स्थापित करके यह मेरे लिए काम है

pip install bcrypt==3.1.2

मुझे हरक्रोक पर मेरे फ्लास्क एप्लिकेशन के साथ bcrypt का उपयोग करने में समस्या हो रही है जब मैं हेरोोको पर काम करता हूं और लॉगिन मार्ग पर जाता हूं, तो मुझे 500 आंतरिक सर्वर त्रुटि मिलती है I यह स्थानीय रूप से ठीक से काम करता है मैं हरकोक पर काम करने वाले बीसीक्रिप्ट पैकेज को कैसे प्राप्त करूं?

ERROR in app: Exception on /login [POST]
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_restful/__init__.py", line 477, in wrapper
    resp = resource(*args, **kwargs)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask/views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_restful/__init__.py", line 587, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/app/app.py", line 196, in post
    elif bcrypt.check_password_hash(user.password, password):
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_bcrypt.py", line 193, in check_password_hash
    return safe_str_cmp(bcrypt.hashpw(password, pw_hash), pw_hash)
  File "/app/.heroku/python/lib/python2.7/site-packages/bcrypt/__init__.py", line 82, in hashpw
    hashed = _bcrypt.ffi.new("char[]", 128)
AttributeError: 'module' object has no attribute 'ffi'

मैंने समाधान पाया है, मैं निम्नलिखित पैकेज का उपयोग कर रहा था: bcrypt , flask_bcrypt और py-crypt । इसलिए मैंने py-bcrypt अनइंस्टॉल किया है, संभवत: यह पैकेज bcrypt पैकेज के साथ संघर्ष में था।

pip uninstall py-bcrypt

मुझे एक समान समस्या का सामना करना पड़ा। यहां मेरे स्टैक ट्रेस के अंतिम भाग की एक प्रति है:

  self.password = User.hashed_password(password) 
File "/app/application/models.py", line 16, in hashed_password 
File "/app/.heroku/python/lib/python3.5/site-packages/flask_bcrypt.py", line 163, in generate_password_hash 
File "/app/.heroku/python/lib/python3.5/site-packages/bcrypt/__init__.py", line 50, in gensalt 
  output = _bcrypt.ffi.new("unsigned char[]", 30) 
AttributeError: module 'bcrypt._bcrypt' has no attribute 'ffi' 

मैं सोच रहा हूं कि यह समस्या हरोकू के लिए विशेष है मैं कुछ मौजूदा फ्लास्क बॉयलरप्लेट का उपयोग कर रहा था लेकिन हेक्रोक पर एक (अलग) बॉयलरप्लेट फ्लास्क प्रोजेक्ट का उपयोग करते समय पिछले प्रोजेक्ट्स में बीक्रिप्ट के साथ यह समस्या भी मेरे साथ हुई है

संभावित समाधान 1

विभिन्न निर्भरता संयोजनों के साथ खेलते हैं। एक मामले में, मुद्दा दूर चला गया जब मैंने अपनी requirements.txt में cryptography शामिल किया। cryptography लेकिन जैसा कि जीन सिल्वा ने इस धागे में उल्लेख किया था, यह संभव है कि निर्भरता संघर्ष में हो सकती है। तो आप कुछ काम करने तक विभिन्न संयोजनों के साथ खेलना चाह सकते हैं।

संभावित समाधान 2

अगर फ्लास्क का उपयोग कर, तो werkzeug.security पैकेज / मॉड्यूल को हैश / चेक हैश के रूप में bcrypt संकुल को सीधे उपयोग करने का विरोध करने का प्रयास करें। मेरे models.py में नीचे दिए गए उदाहरणों में, इस तरह की पंक्तियों की टिप्पणी करना और नए लोगों को मेरे लिए समस्या हल करने के लिए जोड़ना

# from index import db, bcrypt
from index import db
from werkzeug.security import generate_password_hash, check_password_hash


class User(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))

    def __init__(self, email, password):
        self.email = email
        self.active = True
        self.password = User.hashed_password(password)

    @staticmethod
    def hashed_password(password):
        # return bcrypt.generate_password_hash(password)
        return generate_password_hash(password)

    @staticmethod
    def get_user_with_email_and_password(email, password):
        user = User.query.filter_by(email=email).first()
        # if user and bcrypt.check_password_hash(user.password, password):
        if user and check_password_hash(user.password, password):
            return user
        else:
            return None




bcrypt