خطأ في استيراد مكتبة خارجية داخل مكتبة علامات قالب django

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

سؤال

لذلك أنا أحاول كتابة تطبيق Django قابل لإعادة الاستخدام يوفر طريقة لعرض تغذية Twitter على صفحتك. أنا أعرف جيدا أنه موجود بالفعل 20 مرة. إنه ممارسة أكاديمية. :)

هيكل الدليل بسيط جدا:

myproject
|__  __init__.py
|__  manage.py
|__  settings.py
|__  myapp
     |__  __init__.py
     |__  admin.py
     |__  conf
          |__  __init__.py
          |__  appsettings.py
     |__  feedparser.py
     |__  models.py
     |__  templates
          |__  __init__.py
     |__  templatetags
          |__  __init__.py
          |__  twitterfeed.py
     |__  views.py
|__  templates
          |__  base.html
|__  urls.py

عند تشغيل Shell Django، تعمل الوظائف المحددة في TwitterFeed.py بشكل مثالي. أعتقد أيضا أن لدي علامات القالب باسمها بشكل صحيح وتسجيلها.

كما ترون، يمكنني استخدام ممتاز محلل تغذية العالمي. وبعد مشكلتي ليست داخل UFP نفسها، ولكن في عدم القدرة على طلب UFP أثناء استيراد مكتبة Template Tag. عندما {% load twitterfeed %} في Base.py، أحصل على الخطأ التالي:

"TwitterFeed" ليست مكتبة علامة صالحة: تعذر تحميل مكتبة القوالب من django.templatetags.twitterfeed، لا توجد وحدة نمطية باسم FeedParser

يمكنني استيراد FeedParser باستخدام العبارة التالية:

import re, datetime, time, myapp.feedparser

أفضل ما يمكنني قوله، رسالة الخطأ هذه خداع قليلا. أعتقد أن هناك ملهما يحدث عند تحميل مكتبة القالب، وهذا هو تفسير Django لذلك.

هل هناك أي طريقة يمكنني استيراد FeedParser.py داخل تطبيقي القابل لإعادة الاستخدام دون الحاجة إلى مستخدمي التطبيق لوضع FeedParser في مكان ما في PythonPath؟

شكرا!

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

أحل هذا النوع من المشاكل (مكتبات الشحن التي تعتمد على مشروعي العام) بالطريقة التالية. أولا، أقوم بإنشاء دليل "Ext" في جذر مشروعي (في حالتك التي ستكون myproject/ext). ثم أضع التبعيات مثل FeedParser في هذا الدليل الجدار - myproject/ext/feedparser

أخيرا، أقوم بتغيير البرنامج النصي الخاص بي إلى إدراج Ext / Directory في مقدمة SY.Path. هذا يعني كليهما ./manage.py runserver و ./manage.py shell سوف تلتقط المسار الصحيح:

# manage.py
import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'ext'))
# ... rest of manage.py

أجد أن هذا يعمل بشكل جيد حقا إذا كنت لا ترغب في الفوضى مع أشياء مثل virtualenvs. عند نشر مشروعك، يجب عليك التأكد من صحة المسار كذلك - عادة ما يحل هذا عن طريق إضافة نفس الشيء sys.path.insert خط إلى بداية ملف mod_wsgi app.wsgi الخاص بي.

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