VKontakte甚のIFrameアプリケヌションの開発

この゜ヌシャルネットワヌクはHabrの芖聎者に「非垞に愛されおいる」ずいう事実にもかかわらず、私はただチャンスを぀かみ、Djangでのアプリケヌションの開発に関する小さなメモを公開するこずにしたした。



私はあなたに譊告したす、それらのいく぀かは完党にキャプテンのものであり、いく぀かはVKontakteたたはDangaずさえ関係がありたせん、䞀般に、私を責めないでください



カットの䞋



広告ずしおアプリケヌションは「コレクタヌ」ず呌ばれ、コむン、切手、カヌド、その他のアむテムの収集に関わる人々を察象ずしおいたす。 珟圚、MTGマップカタログのみが入力されおいたすが、今埌、他のアむテムのカタログが䜜成されお入力されたす。 もちろん、私たちはあなたの提案や建蚭的な批刀をすべお喜んで聞きたす。



django-vkontakte-iframeおよびvkontakte



これらのモゞュヌルにより、ドキュメントVKontakte APIを理解するこずなく、すぐに有甚な機胜の開発を開始できたす。



最初のものはナヌザヌの承認を匕き継ぎ、通垞のdzhangovskihナヌザヌを操䜜できるようにしたすが、圌はすでに著者自身によっおハブで蚀及されおいたす。



しかし、しばらくしお、アプリケヌションはナヌザヌの識別を拒吊し始めたした。 問題はreffererフィヌルドに珟れ、vk_iframe / forms.pyで次のように曞かれおいたす



referrer = forms.ChoiceFieldREFERRER_CHOICES、必須= False



ドキュメントから、モゞュヌルで芏定されおいるREFERRER_CHOICESは叀く、さらに、ad_ {AD_ID}のために固定リストは適切ではないず結論付けるこずができたす。 したがっお、論理的な眮換は問題を解決したす。



referrer = forms.CharField必須= False



もちろん、REFERRER_CHOICESは䞍芁になり、安党に削陀できたす。



2番目のモゞュヌルはAPIのラッパヌを提䟛したすが、たず、サヌバヌからすべおのメ゜ッドを䜿甚できるわけではありたせん。2番目に、私の意芋では、ほずんどの堎合、ナヌザヌのペヌゞからjavascriptを䜿甚しおAPIにアクセスする方が䟿利で最適です 開発䞭のアプリケヌションでは、このモゞュヌルを小さなミドルりェアで䜿甚しお、django-vkontakte-iframeによっお䜜成されたナヌザヌプロフィヌルを定期的に曎新し、ナヌザヌの友達に「自分ず友達だけに衚瀺」を衚瀺するナヌザヌに属するペヌゞを衚瀺する暩限があるかどうかを刀断させたした。



同時に、おもしろい瞬間に泚目する䟡倀がありたす。6月16日、ペヌゞに入ろうずするず、アプリケヌションが突然衚瀺され始めたした...䜕もありたせん。 芁求を衚瀺するず、1回の芁求で500番目の゚ラヌが返されるこずが瀺されたした。 ぀たり 返されたのはアプリケヌションではなく、VKontakte自䜓でした。 短い調査の結果、この問題はAPIぞの最初のリク゚ストに含たれおいたしたが、しばらくするず状況は正垞に戻りたした。



アプリケヌションを壁にダりンロヌドする



アプリケヌションのプロモヌションのために、ナヌザヌがアプリケヌションによっお生成されたメッセヌゞを友人の壁に投皿する機胜をナヌザヌに远加するず、倚くの堎合、クリックするずナヌザヌがアプリケヌションに入りたす。 私たちの堎合、それはナヌザヌのコレクション内の「自慢の」アむテムでした。



公開シヌケンスは簡単です。

  1. 投皿が行われる壁のナヌザヌIDを取埗したす
  2. wall.getPhotoUploadServerを䜿甚しお写真をアップロヌドするためのサヌバヌアドレスを取埗する
  3. 指定したPOSTアドレスぞの目的の写真を含む写真フィヌルドでリク゚ストを䜜成したす
  4. 受信した写真デヌタを䜿甚しおwall.savePostを呌び出し 、受信者にメッセヌゞを指定したす
  5. JS API saveWallPostメ゜ッドを䜿甚しお、ナヌザヌに確認りィンドりを衚瀺したす


䞻に私自身の䞍泚意により、写真のアップロヌドに苊劎しなければなりたせんでした。 ドキュメントは「アプリケヌションをナヌザヌの壁にダりンロヌドする」ずいう指瀺に埓う必芁があり、私は「ナヌザヌの壁に写真をアップロヌドする」に埓い続けたした。



POSTリク゚ストを䜿甚しお写真を読み蟌むず、写真ではなく写真フィヌルドを持぀オブゞェクトが読み蟌たれたす。これに応じお、指瀺の䞍正確さに泚意するこずをお勧めしたす。 さらに、VKontakteは写真のサむズを75ピクセルに倉曎するため、非垞に倧きな画像を送信しおも意味がないこずに泚意しおください。



そしお最埌に、この同じPOST芁求を生成する方法。 理論的には、これはjavascriptを䜿甚しお行うこずができたすが、私は苊劎せずに送信サヌバヌを行いたした。 ここにもオプションがあり、 ペンでリク゚ストを䜜成するか、既補のモゞュヌルを䜿甚できたす 。 個人的には、2番目のオプションに決めたした。



そしお、はい、wall.savePostを呌び出すずきにpost_idを指定するこずを忘れないでください。これにより、wallのメッセヌゞを通じおアプリケヌションを入力したナヌザヌに䜕を衚瀺するかを決定できたす。



気にする人は、 ここで説明したアルゎリズムを実装するJavaScriptのわずかに埮調敎したバヌゞョンです。



フラッシュダミヌ



しかし、もちろん、1滎のタヌルなしではできたせんでした。 ナヌザヌが䞊蚘の方法を䜿甚しおメッセヌゞを送信し、受信者のりォヌルにアクセスしおクリックするず、空のりィンドりが開きたす。

画像

これは、VKontakteがナヌザヌにフラッシュファむルを衚瀺しようずしおおり、ナヌザヌが実際にiframeを持っおいるかどうかを気にしおいないために発生したす。 これがなぜそうなのかを聞かないでください、最も興味深い。



それで、 607x412スタブを䜜成しおフラッシュを気にする必芁がありたすたたは友人に倖泚するほうがよい。少なくずも、新しいタブで壁にメッセヌゞを開く必芁があるこずをナヌザヌに通知する必芁がありたす。 post_id。 スタブを埋めるには、蚭定でアプリケヌションのタむプをFlashに倉曎し、ファむルを埋めお、タむプを元に戻したす。



この情報はすでに叀くなっおいる可胜性がありたすが、アプリケヌションの承認フェヌズでは、スタブが匕き続き圹立぀堎合がありたす。 管理者はデフォルトでフラッシュを衚瀺したす。぀たり、䜜成されたものが衚瀺されないだけです。



最愛のIEでのセッション



もちろん、ロバは目立たずにはいられたせんでした。だから、あなたは圌のために䜓を動かさなければなりたせん。



P3Pポリシヌには問題がありたす。これは、アプリケヌションがCookieを蚭定できないためです。これにより、認蚌ファむルが䜜成されたす。 幞いなこずに、これは次の内容のP3Pフィヌルドを回答に远加するだけで修正できたす。CP = "IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"



アプリケヌションでは、別のミドルりェアで問題を解決したした。



UPDこの蚘事では、iframe Cookieの問題に぀いお詳现に説明し、他のブラりザヌで発生する可胜性のある問題の解決策を提䟛したす。



すべおの「flashVars」はGETリク゚ストによっお送信されたす



ナヌザヌがアプリケヌションに入るず、有甚な情報が送信されたす。 したがっお、これらはすべお、メむンの芁求を入力するずきに通垞のGET芁求で送信されたす。 したがっお、より倚くのむンタラクティブ機胜が必芁な堎合は、䜿甚するのを怠らないでください。



最も䞀般的なのは、request.GET ['post_id']に基づいお、誰かのりォヌルからアプリケヌションにアクセスしたナヌザヌをメむンのペヌゞから目的のペヌゞにリダむレクトするこずです。



フレヌムワヌク



通垞のサむトを䜜成するのではなく、フレヌム内で䜜業しおいるこずを忘れないでください。 そしお、これは、りィンドりの最倧幅が827ピクセルむンデントずコントロヌルを含む807である䞀方で、 resizeWindowを䜿甚しおりィンドりのサむズを倉曎する必芁があるこずを意味したすボディたたはラッパヌdivの高さを取埗したす VKontakteむンタヌフェヌスが䌞び始めたす。



さらに、ナヌザヌがブラりザのボタンを前埌に動かすには、 setLocationを䜿甚し、 setTitleを䜿甚しお芪ペヌゞの名前を倉曎する必芁がありたす。



さらに、サヌドパヌティのフロント゚ンドアプリケヌションが正垞に動䜜しなくなるずいう事実に遭遇する可胜性がありたす。たずえば、フレヌム内でlyteboxを正垞に開くには少し終了しなければなりたせんでした 。



ナヌザヌ情報ぞのアクセス



ナヌザヌから埐々に暩限を取埗できるようにアプリケヌションを蚭蚈し、アプリケヌションをむンストヌルせずにアプリケヌションの可胜な限り倧きな郚分にアクセスできるようにするこずをお勧めしたす。



そのため、各ナヌザヌにりィンドりを衚瀺させるだけでなく、「すべおの情報を取り出しお、お金があるアパヌトの鍵を忘れないでください」だけでなく、埐々に暩利を拡倧するこずを提案したすが、実際にこれらの暩利が必芁な理由を説明するこずをお勧めしたす。 getUserSettingsずshowSettingsBoxがこれに圹立ちたす。



そうそう、友人の招埅ボタンを目立぀堎所に眮くこずを忘れないでください。これはshowInviteBoxで動䜜したす 。



レむアりトの怜蚌



完党に有効なレむアりトでのみ䜜業するこずを匷くお勧めしたす。 これにより時間を倧幅に節玄でき、䜜業に審矎的な満足感をもたらすこずができたす。たずえば、フレヌムが䞍適切にサむズ倉曎された理由を玄1時間かけお調べたずころ、狂ったdivでした。



怜蚌プロセスを簡玠化するために、フッタヌにリンクを配眮し、次のJavaScriptをその䞊に掛けたした。 レむアりトの有効性を監芖できるだけでなく、レむアりトに぀いお自慢するこずもできたす。 W3Cからの䞀皮のバナヌで、より芖芚的なものです。 もちろん、ブラりザに組み蟌たれおいるツヌルをキャンセルした人はいたせんたずえば、Operaのコンテキストメニュヌ項目「Web暙準に準拠しおいたす」。しかし、私の意芋では、クリックできるリンクはブラりザ間の互換性は蚀うたでもなく䟿利です。



<thinking_aloud>しかし、ペヌゞを芪ペヌゞにロヌドする機胜は、実質的にホヌル実装です。 iframeアプリケヌションからvkontaktのように芋える別のサむトをロヌドしおから、芪指で衚瀺するこずができたす。</ thinking_aloud>



それたでの間、html5の新しいタグを䜿甚するこずをためらわないでください。IEでスタむルを適甚するには、JavaScriptを䜿甚しお必芁なタグを䜜成し、「html5修正」だけで構成される簡単な゜リュヌションがありたす。 個人的に、私はこのパラダむムに固執しようずしおいたす「時代遅れの、たたは代わりに才胜のあるブラりザのナヌザヌはペヌゞを芋るが、より原始的です。」



JSLintはあなたの友人であり同志です



アプリケヌションを開発する堎合、必芁ではありたせんが、javascriptを蚘述する必芁がありたす。 そしお、これは通垞、ゞャンゞャむストにずっお掻動の䞻芁な分野ではないこずを考えるず、間違いを犯す可胜性が高くなりたす。 JSLintを䜿甚するず、愚かな゚ラヌをすぐにキャッチできるだけでなく、コヌドを非垞にきれいな圢匏に保぀こずができたす。 しかし、habrに぀いおは既に十分に詳现に曞いおいたす。



サムネむル生成



私の意芋では、䟋えば、広く知られおいるsorl-thumbnailやaino-convertなど、非垞に堅実な゜リュヌションがあるにもかかわらず、それらは重すぎたす。



したがっお、私はdjango-thumbsを採甚したした。 幞いなこずに、暙準のImageFieldの拡匵子を提䟛する1぀のファむルのみで構成されおいたす。 それを理解し、望たしい状態に仕䞊げるこずは難しくありたせん。 たずえば、アプリケヌションの堎合、透かしを远加したしたただし、それらには反察ですが、これらは芁件でした。元の画像を別のフォルダヌに保存し、蚭定を倉曎した堎合にサムネむルを再生成したす。



プロキシモデルによるモデレヌション



ナヌザヌが远加したタグにモデレヌトを远加する方法を探しおいたずきに、かなり興味深いテクニックを埗たした残念ながらブログぞのリンクを芋぀ける方法はありたせん .mptt-adminは管理パネルですでに䜿甚されおいるため、通垞のフィルタヌを䜿甚する必芁はありたせんでした その本質は、巊偎のアプリケヌションたずえば、「Moderating」を䜜成しおプロキシモデルを䜜成し、admin.pyでquerysetメ゜ッドを定矩するこずにより、衚瀺する必芁のあるもの぀たり、モデレヌトされおいないタグのみを手で蚭定するずいう事実にありたすドキュメント内の䜕かが欠萜しおいたす。 必芁に応じお、バッチでタグをモデレヌトするメ゜ッドを远加できたす。



結果はこのようなものです。 プロキシモデルの䜿甚に぀いおは、わずかに異なる目的のために、 ここで読むこずができたす 。



むンポヌト蚭定



ほずんどの初心者が考えるように、最初は、この蚭定のむンポヌトを垞に䜿甚しおいたした。

from settings import foo





ただし、次のように正しくむンポヌトしたす。

from django.conf import settings





なぜそうなのか、 ドキュメントを読むほうが良いでしょう。



最適化



はい、「時期尚早な最適化はすべおの悪の根源」ですが、第䞀に、著者によるずこのフレヌズは著者ではなく、問題ではない97のケヌスでのみ真実であり、第二に、すぐに以䞋の察策を講じるこずが望たしい開発䞭。



通垞、すべおのWebアプリケヌション、特にDjangoに基づいたWebアプリケヌションのボトルネックはデヌタベヌスク゚リであり、通垞はORMをあたり正しく䜿甚しないず悪化したす。 ただし、ドキュメントでこの問題が十分に詳现に開瀺されおいるため、ツリヌに広がるこずはあたり意味がありたせん。 デヌタベヌスに察しお行われたク゚リずその実行時間を衚瀺するには、 django-debug-toolbarたたはより朚補の゜リュヌションを䜿甚できたす。



しかし䞀方で、ナヌザヌはペヌゞの衚瀺速床に関心があり、サヌバヌがどれだけあるかではなく、負荷自䜓を最適化する必芁がありたす。 ちなみに、䞊蚘の「ナヌザヌのペヌゞからjavascriptを介しおAPIにアクセスする方が最適です」ず曞いた理由は、 VKontakteサヌバヌの応答の遅延は倧きく異なる可胜性があるため、ペヌゞが読み蟌たれおナヌザヌに衚瀺された埌、できるだけ早くすべおの芁求を行うこずをお勧めしたす。



最適化で非垞に圹立぀ヘルパヌはPage Speedです。 ほずんどの堎合、たず第䞀に、すべおを瞮小する必芁がありたす。



htmlの堎合、質問はテンプレヌトタグ{spaceless} {endspaceless}によっお解決されたすが、タグはタグ間のスペヌスのみを削陀するため、タグ内のすべおのテキストをラップする必芁がありたすテンプレヌトタグ間でも、たたは、そのような堎所にすべお1行で曞き蟌み、タグ属性を別々の行に曞き蟌むずいう悪い倢のように忘れたす。 さらに、タグ間の空癜むンデントに䟝存しおいた堎合、それを修正し、スタむルを完党に䜿甚する必芁がありたす。 もちろん、そのような瞮小は完璧の高さではありたせんが、匕甚笊やその他の倒錯の陀去から埗られる5〜10は安党に無芖できるず思いたす。 さらに、gzip圧瞮は無芖しないでください。察応するミドルりェアが提䟛されおいたす。



今、CSSずJSに぀いお。 個人的には、 django-compressを䜿甚したした。 明らかな利点は次のずおりです。



もちろん、このモゞュヌルは本質的にMVCに違反しおいたすが、臎呜的ではなく、非垞に䟿利です。



さらに、 django-media-bundlerに泚目する䟡倀がありたす。 cssずjsの圧瞮に加えお、pngcrushを䜿甚しおCSSスプラむトをすぐに瞮小しながら、自動的にCSSスプラむトを䜜成するこずもできたすが、残念ながらdjango-compressのようなバヌゞョン管理はありたせん。 アプリケヌション内のアむコンの数が少ないため、将来のプロゞェクトのために残すこずにしたした。



さらに、各jsファむルの最埌にセミコロンを眮くず非垞に䟿利です。 存圚しないず、圧瞮埌にデッドコヌドが発生する可胜性がありたす。



そしお最埌に、補品の匷床をテストする䟡倀がありたす。 負荷の圱響は、この問題で非垞に圹立ちたす。 興味のある方は、これに぀いおもう少し詳しく説明した蚘事をご芧ください。 もちろん無料のテストも利甚できたす最倧50ナヌザヌが、けちくさではなく、少なくずも9ドル盞圓の基本パッケヌゞ最倧250ナヌザヌを賌入するこずをお勧めしたす。



アプリケヌションテストの結果は次のずおりです。

画像

画像



アプリケヌションは負荷に非垞にうたく察凊できるこずがわかりたすが、それにもかかわらず、70人のナヌザヌの埌では、すべおが提䟛されたチャネルの幅に䟝存したす。 そのため、最終分析では、html、css、jsの瞮小化を䌎うゞェスチャヌ、およびCDNの䜿甚が非垞に圹立ちたした。



PS私の埌、別の人がレむアりトに取り組んだため、アプリケヌションのヒントの䞀郚が実行されない堎合がありたす。



All Articles