كيف يمكنني حماية الثعبان تعليمات البرمجة الأساسية بحيث يمكن للضيوف رؤية وحدات معينة ولكن ذلك لا يزال يعمل ؟

StackOverflow https://stackoverflow.com/questions/1443146

سؤال

نحن في بداية مشروع جديد في بيثون مع بعض الخوارزميات الملكية و الحساسة بت من المنطق الذي نود أن تبقى خاصة.ونحن أيضا سوف يكون عدد قليل من الغرباء (حدد أفراد الجمهور) العمل على المدونة.لا يمكننا منح الغرباء من الوصول إلى صغيرة خاصة أجزاء من التعليمات البرمجية ، ولكن نود نسخة عامة للعمل بشكل جيد بما فيه الكفاية بالنسبة لهم.

أقول هذا المشروع ، فو ، وحدة ، 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 المستندات التي توضح كيف يعمل هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top