سؤال

لقد دفعت نسخة جديدة من موقع الويب الخاص بي ، ولكن الآن لا يتم نشر CSS والصور الثابتة بشكل صحيح.

ها هي صفحة العبث: http://www.gaiagps.com

يعرض AppEngine أحدث إصدار على أنه صحيح: http://1.latest.gaiagps.appspot.com/

أي مساعدة؟

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

المحلول

لقد رأيت هذا من قبل على محرك التطبيق ، حتى عند استخدام معلمات استعلام ذاكرة التخزين المؤقت مثل /stylesheets/default.css?{{ App.Version }}.

ها هي نظريتي (غير المؤكدة):

  1. يمكنك الضغط على إصدار جديد عن طريق نشر أو تغيير إصدار جديد إلى default.
  2. بينما يتم نشر هذا التحديث لجميع مثيلات GAE التي تدير تطبيقك ...
  3. ... شخص ما يضرب موقعك.
  4. طلب مورد ثابت default.css{{ App.Version }} يتم إرسالها إلى Google CDN ، والتي لا تملكها بعد.
  5. يسأل CDN من Google GAE عن المورد قبل الانتشار من الخطوة رقم 2 لجميع الحالات.
  6. إذا كنت محظوظًا ، فإن GAE يقدم المورد من مثيل يقوم بتشغيل الإصدار القديم ...
  7. ... الذي يتم تأكيده الآن في CDN من Google كإصدار "جديد" موثوق.

عندما يحدث هذا (إذا كان هذا ما يحدث) ، يمكنني أن أؤكد أنه لن يساعد أي قدر من عمل متصفح ذاكرة التخزين المؤقت. تعقد خوادم Google CDN الإصدار الخاطئ.

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

نصائح أخرى

فيما يلي ما نجح بالنسبة لي.

  1. خدمة ملف CSS الخاص بك من المجال الثابت. يتم إنشاء هذا تلقائيًا بواسطة GAE.

    //static. {Your-app-id ).appspot.com/ (

  2. نشر طلبك. عند هذه النقطة ، سيتم كسر تطبيقك.

  3. تغيير إصدار ملف CSS

    //static. {Your-app-id)

  4. نشر مرة أخرى.

في كل مرة تقوم فيها بتغيير ملف CSS. سيكون عليك تكرار 2،3 و 4.

يبدو رابطك جيدًا بالنسبة لي ، إلا إذا فقدت شيئًا ما.

قد تكون قد قمت بتخزين CSS القديمة ، وعدم الحصول على CSS الجديد بعد تحديثه. حاول مسح ذاكرة التخزين المؤقت للمتصفح ومعرفة ما إذا كان ذلك يعمل.

الانتقال إلى 1.Latest تنزيل CSS الجديد لأنه ليس في ذاكرة التخزين المؤقت الخاصة بك ، لذلك يظهر لك بشكل صحيح.

كان لي هذه المشكلة أيضا. كنت أستخدم قارورة مع GAE ، لذلك لم يكن لدي معالج ثابت في بلدي app.yaml. عندما أضفته ، يعمل النشر. حاول إضافة شيء مثل هذا

handlers:
- url: /static
  static_dir: static

لك app.yaml ونشر مرة أخرى. عملت معي. من الواضح أن Google تحاول التحسين من خلال عدم تحديث الملفات التي تعتقد أنها لا يمكن للمستخدمين رؤيتها.

كما وجدت شوريش, ، مستندات للبيئة القياسية لبيوتون ، أن كلا الإعدادات ل تنتهي صلاحية ذاكرة التخزين المؤقت الثابت, العنصر الفردي expiration والعنصر الأعلى default_expiration, ، هي المسؤولة عن تحديد "وقت انتهاء الصلاحية [الذي] سيتم إرساله في Cache-Control و Expires رؤوس استجابة HTTP ". هذا يعني أنه" من المحتمل أن يتم تخزين الملفات من قبل متصفح المستخدم ، وكذلك عن طريق خوادم وكيل التخزين المؤقت الوسيطة مثل مقدمي خدمات الإنترنت ".

المشكلة هنا هي أن "إعادة النشر لإصدار جديد من التطبيق سوف ليس أعد تعيين أي مخبأ ". لذا إذا تم تعيين المرء default_expiration إلى ، على سبيل المثال ، 15 يومًا ، ولكنه يقوم بتغيير في ملف CSS أو JS وإعادة نشر التطبيق ، لا يوجد أي ضمان بأن هذه الملفات سيتم تقديمها تلقائيًا بسبب ذاكرة التخزين المؤقت النشطة ، لا سيما بسبب خوادم وكيل التخزين المؤقت الوسيطة ، والتي قد تكون قم بتضمين خوادم Google Cloud-ما يبدو أنه هو الحال منذ الوصول إلى project-name.appspot.com يخدم أيضًا ملفات قديمة.

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

على الرغم من أن الوثائق تنص على أنه من غير الممكن مسح وكلاء التخزين المؤقت الوسيطة ، يمكن للمرء أن يحذف على الأقل ذاكرة التخزين المؤقت لـ Google Cloud.

من أجل القيام بذلك, ، توجه إلى الخاص بك وحدة التحكم السحابية Google وافتح مشروعك. تحت قائمة الهامبرغر اليسرى ، توجه إلى التخزين -> متصفح. هناك يجب أن تجد دلوًا واحدًا على الأقل: your project-name.appspot.com. ضمن عمود دورة الحياة ، انقر على الرابط فيما يتعلق بـ project-name.appspot.com. احذف أي قواعد موجودة ، لأنها قد تتعارض مع تلك التي ستنشئها الآن.

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

ستستغرق هذه القاعدة التي تم إنشاؤها حديثًا ما يصل إلى 24 ساعة لتسري مفعولها ، ولكن على الأقل لمشروعي ، استغرق الأمر بضع دقائق فقط. بمجرد تشغيله ، فإن إصدار الملفات التي يتم تقديمها بواسطة تطبيقك ضمن project-name.appspot.com ستكون دائمًا أحدث نشر, ، حل مشكلة. أيضًا ، إذا كنت تقوم بتحرير ملفاتك الثابتة بشكل روتيني ، فيجب عليك إزالة default_expiration عنصر من ملف app.yaml ، والذي سيساعد في تجنب التخزين المؤقت غير المقصود بواسطة خوادم أخرى.

هنا ما الذي نجح بالنسبة لي:

أولا ، لقد غيرت إصدار على app.yaml.

ثم اتبع هذه الخطوات أدناه

انتقل إلى وحدة التحكم الخاصة بك -> انقر على مشروعك.

في القائمة الجانبية ، انقر فوق حساب -> الإصدارات:

سيكون هناك كل الإصدارات ، وأي الإصدار افتراضي. تم تعيين لي على نسخة أقدم.

ضع علامة على الإصدار الجديد.

بالنسبة لي عملت. اي اهتمامات؟

من مستندات البيئة القياسية لـ Pyhton: static_cache_expiration.

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

بالنسبة للأشخاص الجدد الذين يأتون إلى هذه الأسئلة القديمة/مجموعة الإجابات التي أردت تقديم إجابة محدثة. أعتقد في 2018-19 أن المعلومات التالية ستصلح معظم مشكلات تحديث CSS التي يواجهها الأشخاص:

تأكد الخاص بك app.yaml لديه ما يلي:

 handlers:
   - url: /static
     static_dir: static
  • يجري gcloud app deploy
  • البرد لمدة 10 دقائق .. والتحويل على موقع الويب الخاص بك

حسنًا ، بالنسبة للأشخاص الجدد الذين يرون هذه المشكلة ، جربت نهج استنباط ذاكرة التخزين المؤقت ويبدو أنه تم إصلاحه هنا مثال على ما فعلته لاستيراد CSS على ملف App.cfg ، قم بإنشاء متغير للاحتفاظ بتقطيفك على النحو المحدد في app.yaml ملف وضبطه كواحد أدناه

<link href="{{ url_for('static', filename='file.css') }}?{{config.APP_ID}}" rel="stylesheet"> 

أيضًا لملف app.yaml ، أضف هذا التكوين ليكون على الجانب الآمن

معالجات:

  • url: /static static_dir: ثابت

حاول مسح ذاكرة التخزين المؤقت على متصفحك. كان له نفس المشكلة بالضبط وحصلت عليها ببساطة عن طريق مسح ذاكرة التخزين المؤقت.

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