كيف يمكنني حماية الثعبان تعليمات البرمجة الأساسية بحيث يمكن للضيوف رؤية وحدات معينة ولكن ذلك لا يزال يعمل ؟
-
22-07-2019 - |
سؤال
نحن في بداية مشروع جديد في بيثون مع بعض الخوارزميات الملكية و الحساسة بت من المنطق الذي نود أن تبقى خاصة.ونحن أيضا سوف يكون عدد قليل من الغرباء (حدد أفراد الجمهور) العمل على المدونة.لا يمكننا منح الغرباء من الوصول إلى صغيرة خاصة أجزاء من التعليمات البرمجية ، ولكن نود نسخة عامة للعمل بشكل جيد بما فيه الكفاية بالنسبة لهم.
أقول هذا المشروع ، فو ، وحدة ، bar
, مع وظيفة واحدة ، get_sauce()
.حقيقة ما يحدث في get_sauce()
هو السر لكن نريد نسخة عامة من get_sauce()
العودة مقبول ، وإن كانت غير صحيحة ، النتيجة.
ونحن أيضا تشغيل منطقتنا التخريب الخادم لذلك لدينا السيطرة الكاملة على من يستطيع الوصول إلى ما.
روابط الرمزية
كانت فكرتي الأولى symlinking — بدلا من bar.py
, وتوفير bar_public.py
الجميع bar_private.py
الداخلية المطورين فقط.للأسف ، وخلق روابط الرمزية مملة ، دليل العمل — خاصة عندما يكون هناك حقا سيكون حوالي عشرين من هذه الوحدات.
والأهم من ذلك أنه يجعل إدارة التخريب authz الملف صعبا ، لأن لكل وحدة كنا نريد حماية استثناء يجب أن تضاف على الملقم.شخص ما قد تنسى أن تفعل هذا و قصد تحقق في الأسرار...ثم وحدة في الريبو لدينا لإعادة بناء مستودع دون ذلك ونأمل أن الخارج لم تنزيله في الوقت الحالي.
عدة مستودعات
كان الفكر القادم أن يكون اثنين من مستودعات:
private
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
└── bar.py
public
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
├── bar.py
├── baz.py
└── quux.py
والفكرة هي أنه الداخلي فقط المطورين سوف تكون قادرة على الخروج سواء private/
و public/
.الداخلية المطورين سوف تعيين PYTHONPATH=private/trunk:public/trunk
, ولكن الجميع سوف فقط PYTHONPATH=public/trunk
.ثم سواء الداخليين والخارجيين يمكن from foo import bar
والحصول على حق وحدة, صحيح ؟
دعونا نحاول هذا:
% PYTHONPATH=private/trunk:public/trunk python
Python 2.5.1
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo.bar
>>> foo.bar.sauce()
'a private bar'
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
أنا لست الثعبان الخبراء ، ولكن يبدو أن الثعبان بالفعل قراره بشأن وحدة foo
ويبحث نسبة إلى:
>>> foo
<module 'foo' from '/path/to/private/trunk/foo/__init__.py'>
ولا حتى حذف foo
يساعد على:
>>> import sys
>>> del foo
>>> del sys.modules['foo']
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
هل يمكنك أن تقدم لي أفضل حل أو اقتراح ؟
المحلول
في __init__
طريقة foo
حزمة يمكنك تغيير __path__
لجعلها تبدو لها وحدات في الدلائل الأخرى.
قم بإنشاء دليل يسمى secret
ووضعها في الخاص التخريب مستودع.في secret
وضع الملكية bar.py
.في __init__.py
الجمهور foo
حزمة وضعت في شيء ما مثل:
__path__.insert(0,'secret')
وهذا يعني بالنسبة للمستخدمين الذين لديهم مستودع خاص وهكذا secret
الدليل أنها سوف تحصل على الملكية bar.py
كما foo.bar
كما secret
الدليل الأول في مسار البحث.للمستخدمين الآخرين ، بيثون لن تجد secret
وسوف تبدو على النحو التالي دليل في __path__
و لذلك سيتم تحميل عادي bar.py
من foo
.
لذلك سوف ننظر بشيء من هذا القبيل:
private
└── trunk/
└── secret/
└── bar.py
public
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
├── bar.py
├── baz.py
└── quux.py
نصائح أخرى
استخدام نوع من البرنامج المساعد النظام والحفاظ على الإضافات الذاتية الخاصة بك, ولكن أيضا متوفرة الإضافات التي يحصل شحنها مع فتح رمز.
المساعد أنظمة كثيرة.يمكنك بسهولة جعل الميت بسيطة منها نفسك.إذا كنت تريد شيئا أكثر تقدما أفضل Zope مكون العمارة ، ولكن هناك أيضا خيارات مثل setuptools entry_points ، إلخ.
واحد للاستخدام في حالتك سيكون السؤال الثاني.
هنا حل بديل لاحظت عند قراءة المستندات قارورة:
flaskext/__init__.py
الغرض الوحيد من هذا الملف بمناسبة حزمة مساحة الحزمة.هذا هو المطلوب بحيث وحدات متعددة من مختلف PyPI حزم يمكن أن تتواجد في نفس حزمة بايثون:
__import__('pkg_resources').declare_namespace(__name__)
إذا كنت تريد أن تعرف بالضبط ما يحدث هناك, الخروج أو توزيع أو setuptools المستندات التي توضح كيف يعمل هذا.