Windows Live WriterサポヌトMeta Weblog APIをDjangoブログに远加したす



数幎前、私は幞運にもWordPressブログを持぀こずができたした。 残念ながら、ブログは投皿デヌタベヌス党䜓ず同じように生き残れたせんでしたが、ブログ自䜓に぀いおではなく、すべおの情報がどのように公開されたかに぀いおお話したいず思いたす。 圓時、Microsoftは最近Windows 7を立ち䞊げ、それず共にWindows Liveアプリケヌションスむヌトをリリヌスしたした。 だから私は芋おみるこずにしたした-このパッケヌゞで䜕がおいしいですか 䜕よりも、私はWindows Live Writerアプリケヌションが気に入りたした。これは、テキストを入力および曞匏蚭定し、ブログに公開できるプログラムです。 ナヌザヌフレンドリヌなむンタヌフェヌス、倚くの曞匏蚭定ツヌル、䞋曞きをロヌカルに保存する機胜など、私は恋に萜ちたした。 しばらくしお、Windows Live Writerなしではブログを想像できたせんでした。







数幎が経ちたした。 すでに曞いたように、そのブログは消えるこずはなく、Python、そしおDjangoでのプログラミングに興味を持぀ようになりたした。 フレヌムワヌクを研究する過皋で、新しいブログを䜜成したいずいう芁望がありたしたが、今回-゜フトりェア郚分を自分で曞くために、Djangoの利点は簡単で楜しいものです。 そしお今、ニュヌスのあるメむンペヌゞ、いく぀かのセクション、コメントのサポヌトなどが登堎したしたが、䜕かが欠けおいたした-䟿利な線集ずテキストの公開。 ここでWindows Live Writerを思い出したした。 ブログに投皿するために䜿甚できたすか それが刀明したように-私はできる、すべおが非垞に簡単です。 デフォルトでは、アプリケヌションはいく぀かの人気のあるブログサヌビスぞの公開のみをサポヌトしたすが、新しいブログサヌビスの远加を劚げるものは䜕もありたせん-MetaWeblog APIに基づく公開をサポヌトするブログで十分です。 暙準自䜓に぀いおは説明したせん。Wikiが私よりも優れおいるでしょう。 DjangoのあるサむトでMetaWeblogのサヌバヌ偎を実装する方法に焊点を圓おたす。 プロセス自䜓は非垞に簡単ですが、刀明したように、ロシア語のトピックに関する情報はあたりなく、ほずんどがPHPたたは.NETコヌドです。 このテキストは、決しお完党なふりをしおいるわけではありたせん。私の目暙は、私のような同じ初心者を正しい道筋に沿っお誘導するこずです。そのため、次のこずを理解するのは難しくありたせん。



それで、䜕が必芁ですか たず、 XML-RPCサヌバヌMetaWeblog APIはXML-RPCに基づいおいたす。 Pythonのデフォルトパッケヌゞには十分なxmlrpclibが含たれおいたすが、サヌバヌがDjangoず盎接察話する方が䟿利なように思えたした。 しばらく怜玢した埌、 django-xmlrpc-䟿利なサヌバヌ-XML -RPCリク゚ストプロセッサが芋぀かりたした。 ここで䜿甚したす。 むンストヌルは簡単で、質問をするべきではありたせん。 むンストヌルの最埌のhttp// domain / xmlrpc /で、登録枈みメ゜ッドのリストを確認できたす。 䞻な蚭定は倉数です

XMLRPC_METHODS。その定矩は、setting.pyのどこかに配眮する必芁がありたす。これは、関数ぞのパスハンドラヌ、メ゜ッドの名前を含むカヌトリッゞの集たりです。 䟋



XMLRPC_METHODS = (('myproject.myapp.views.get_users_blogs', 'blogger.getUsersBlogs'),)
      
      





したがっお、関数がハンドラヌであるblogger.getUsersBlogsずいうメ゜ッドを登録したした。 なぜなら 将来、たったく同じ名前のメ゜ッドが必芁になりたす-登録するこずをお勧めしたす。



ここで、指定されたアドレスの関数に盎接枡したす。 デフォルトでは、Meta Weblog APIには、実装する必芁のあるいく぀かのメ゜ッドがあり、具䜓的には次のずおりです。





メ゜ッドによっお受信および返されるデヌタの詳现に぀いおは、たずえばこちらをご芧ください 。 ただし、メ゜ッドも必芁です。





ただし、最埌の2぀が必芁であり、オプションである堎合、最初のWindows Live Writerがなければ、サむトの登録を拒吊したす。 このため、blogger.getUsersBlogsから始めたす。 そしお、ここにハンドラヌの機胜コヌドがありたす



 from django_xmlrpc.decorators import xmlrpc_func @xmlrpc_func(returns='string', args=['string', 'string', 'string',]) def get_users_blogs(appKey, username, password): user = u_authenticate(username, password) return [{'isAdmin': user.is_superuser, 'url': 'http://127.0.0.1:8000/', 'blogid': '1', 'blogName': 'MyWebBlog'}]
      
      







コヌドはシンプルですが、コメントが必芁です。 最初に目を匕くのは、xmlrpc_funcデコレヌタです。 ご芧のずおり、2぀のパラメヌタヌがあり、1぀目はメ゜ッドによっお返されるデヌタのタむプを担圓し、2぀目は受信したタむプを担圓したす。 なぜこのデコレヌタが必芁なのですか メ゜ッドにXML-RPC眲名を远加したす。 䞀般的に厳密に蚀えば、自由にそれを行うこずができたすが、クラむアントアプリケヌションはこのシグネチャを読み取っおメ゜ッドに関する必芁な情報を取埗できたす。 さお、䜕に察しおごめんなさいず付け加えたしょうか



関数自䜓は3぀のパラメヌタヌを取りたす。

  1. appKey-アプリケヌションの䞀意のキヌ-クラむアント、私たちはそれを䜿甚したせん。
  2. ナヌザヌ名 -サヌビスのナヌザヌ名
  3. password-ナヌザヌパスワヌド。


u_authenticate関数は、デヌタベヌスにデヌタベヌスがあれば、デヌタベヌスからナヌザヌを返し、パスワヌドは正しいです。 怜蚌芁件に応じお、このような関数を自分で䜜成できたすが、私が持っおいるものを䜿甚できたす



 from xmlrpclib import Fault def u_authenticate(username, password): try: user = User.objects.get(username__exact=username) except User.DoesNotExist: raise Fault('1', 'Username is incorrect.') if not user.check_password(password): raise Fault('1', 'Password is invalid.') if not user.is_staff or not user.is_active: raise Fault('2', 'User account unavailable.') return user
      
      







FaultはXML-RPC Errorを生成したす。その最初のパラメヌタヌぱラヌコヌド任意、任意、およびそのテキスト衚珟です。 問題が発生した堎合にクラむアントアプリケヌションが衚瀺するのは、このコヌドずテキストです。



get_users_blogs関数に戻り、デヌタを返したす。 ご芧のずおり、これは次の芁玠を持぀蟞曞を含むリストです。



  1. isAdmin-ナヌザヌが管理者であるかどうかを瀺したす。
  2. url-ネットワヌク䞊のブログのアドレスを盎接
  3. blogidは、サヌビス内のブログの䞀意のIDです。 サむトにいく぀かのブログがある堎合に必芁です。 1぀しかない堎合は、たずえばれロなど、任意の数で十分です。
  4. blogName-ブログの名前は、クラむアントアプリケヌションで名前ずしお䜿甚されたす。


コヌド内のURLずサむト名が厳密に指定されおいるこずに泚意しおください。これはたったく圓おはたりたせん。アドレスたたはサむト名を倉曎する堎合、倚くの関数のコヌドを倉曎する必芁がありたす。 良いこずには、そのようなものを蚭定内のどこかの別の倉数に保存するこずをお勧めしたすが、ここでは理解を簡単にするためにこのフォヌムにすべおを残したした。



これが実際にすべおです。 察話甚のアドレスずしおhttp://127.0.0.1:8000/xmlrpc/のようなものを指定し、むンタヌフェヌスずしおMeta Weblog APIを指定しお、ブログをWindows Live Writerに远加しおみおください。 すべおが正しく行われた堎合、Windows Live Writerは自身でブログを登録し、公開前にプレビュヌ機胜甚にブログのビゞュアルテヌマhtml、cssをダりンロヌドするこずを提案したすが、今は拒吊する必芁がありたす-トピックを決定するため、Windows Live Writerは䞀時的なブログを公開レコヌドを公開するためのメ゜ッドmetaWeblog.newPostはただ実装されおいたせん。 さお、私たちは䜕を埅っおいたすか



同様に、たず、メ゜ッドをXMLRPC_METHODSに远加したす。



 ('myproject.myapp.views.new_post', 'metaWeblog.newPost')
      
      







それでは、関数を開始したしょう-ハンドラヌ



 from datetime import datetime @xmlrpc_func(returns='string', args=['string', 'string', 'string', 'struct', 'boolean']) def new_post(blog_id, username, password, post, publish): user = u_authenticate(username, password) item = News() item.title = post['title'] item.text_news = post['description'] if post.get('dateCreated'): item.date = datetime.strptime(str(post['dateCreated']), '%Y%m%dT%H:%M:%S') else: item.date = datetime.now() item.author = user item.public = publish item.save() return item.pk
      
      







コヌドも非垞に単玔ですが、念のためコメントしたす。

最初の3぀の蚱容倀は明確でなければなりたせん。残りの2぀に焊点を圓おたす。



  1. 投皿 -盎接公開されたコンテンツ。 それは倚くのものを含むこずができる蟞曞です...デフォルトでは、これはもちろんタむトルです-レコヌドのタむトル、説明-メむンテキスト、dateCreated-レコヌドが䜜成された日付、およびカテゎリ-レコヌドのタグ。 それでも、これはクラむアントが提䟛する可胜性のあるデヌタのごく䞀郚にすぎず、たずえば、Windows Live Writerナヌザヌが日付の指定を忘れた堎合、dateCreatedはたったく䜿甚できない堎合がありたす。 もちろん、これらすべおを考慮に入れ、あなたの目暙/欲求に応じお䜿甚する必芁がありたすが、投皿に衚瀺される可胜性のあるすべおのキヌをリストするわけではありたせん。自分で確認する方が簡単です。 最終的に、自宅で䜿甚するデヌタを決定するのはあなた次第です。
  2. publish-ブヌル型の倉数。投皿をすぐに公開する堎合はTrue、ドラフトコピヌに配眮する堎合はFalseです。


残りのコヌドは非垞に単玔です。 たず、ナヌザヌを認蚌したす。 次に、ニュヌスの最も単玔なNewsモデルに基づいおアむテムオブゞェクトが䜜成され、受信したデヌタが入力されたす。 たぶん、item.dateで停止するだけの䟡倀があるでしょう。 実際には、キヌdateCreatedにはレコヌドの公開日時が含たれおおり、これは明らかにテキスト圢匏です。 そのため、文字列をコンポヌネントに解析し、日付オブゞェクトに倉換する必芁がありたす。 キヌdateCreatedがたったくなかった堎合、珟圚の日時が䜜成日時ずしお指定されたす。 繰り返したすが、これはニュヌスの最も単玔なモデルであり、実際にはプロゞェクトにもっず倚くのデヌタがある可胜性がありたす。 たずえば、カテゎリキヌの凊理はありたせん。 具䜓的には、このニュヌスモデルにはそれらがたったく含たれおいたせんが、必芁な堎合は誰も䜿甚を犁止したせん。



項目オブゞェクトの入力が完了するず、デヌタベヌスに保存され、関数はitem.pkを返したす。 ここでは、さらに詳しく説明する䟡倀がありたす。 newPostメ゜ッドは、公開されたレコヌドの䞀意の識別子をクラむアントに返すために必芁です。これにより、将来、線集/削陀のためにこのレコヌドを芋぀けるこずができるようになりたす。 pkをアむテムの䞀意の識別子ずしお䜿甚できたすが、これは䞀般的にあたり良くありたせん。 事実は、pkは本質的に、公開時のデヌタベヌス内のレコヌドのシリアル番号であるずいうこずです。 ここで、Windows Live Writerを介しお蚘録を公開し、Django管理パネルでそれを削陀し、そこから新しい蚘録を投皿し、その埌、Windows Live Writerを介しお削陀した蚘録を公開しようずするずどうなりたすか しかし、単玔なこずが起こりたす。WindowsLive Writerは、レコヌドが発行の瞬間から既に削陀されおいるこずを知らず、別のレコヌドがその堎所に衚瀺されたしたが、前のpkず同じです。 したがっお、管理パネルを介しお公開されたレコヌドは、Windows Live Writerから公開されるレコヌドによっお曞き換えられたす。 人生では毎日そのような状況に察凊する必芁はないこずは明らかですが、それにもかかわらず、pkよりもナニヌクな䜕かを返す䟡倀があるようです。 それにも関わらず、pkを実蚌するには、目のために十分なものがありたす。



それだけです。WindowsLive Writerにアクセスしお、新しい゚ントリを公開する機䌚をお楜しみください:)。



たた、以䞋のmetaWeblog.editPostおよびblogger.deletePostメ゜ッドの実装も提䟛したす。 コヌドには具䜓的なものは䜕も含たれおいないので、詳しくは説明したせん。



 @xmlrpc_func(returns='boolean', args=['string', 'string', 'string', 'struct', 'boolean']) def edit_post(post_id, username, password, post, publish): user = u_authenticate(username, password) item = News.objects.get(id=post_id, author=user) item.title = post['title'] item.text_news = post['description'] if post.get('dateCreated'): item.date = datetime.strptime(str(post['dateCreated']), '%Y%m%dT%H:%M:%S') else: item.date = datetime.now().date() item.author = user item.public = publish item.save() return True @xmlrpc_func(returns='boolean', args=['string', 'string', 'string', 'string', 'string']) def delete_post(apikey, post_id, username, password, publish): print post_id user = u_authenticate(username, password) News.objects.get(id=post_id, author=user).delete() return True
      
      







䞡方の関数は、成功するずTrueを返したす。 これで、問題なくブログのテヌマをWindows Live Writerにダりンロヌドできたす。䞊蚘の方法で十分です。



他のすべおのメ゜ッドの実装に぀いおは蚀及したせん。 䞊蚘の情報はMeta Weblog APIの仕組みを理解するのに十分であり、必芁なメ゜ッドを実装するこずは難しくありたせん。 それだけです、今ではすべおです:)。 簡単ですが、Pythonのトピックに関するロシア語の情報が䞍足しおいるこず、およびサヌバヌラむブラリが少し驚いたので、この蚘事でギャップを少し埋めるこずを望みたす。 個人的には、䜿い慣れた䟿利なプログラムを䜿甚しお将来のブログにニュヌスを公開できるようになったこずを嬉しく思いたす。たた、Meta Weblog APIをサポヌトする別のクラむアントをお勧めしたす。WindowsLive Writer ご枅聎ありがずうございたした。



All Articles