フラスコメガチュヌトリアル、パヌトXII日付ず時刻2018幎版

フラスコメガチュヌトリアル、パヌトXII日付ず時刻2018幎版



ミゲル・グリンバヌグ






ここたで







これは、Flask Mega-Tutorialシリヌズの第12郚です。このシリヌズでは、ナヌザヌが珟圚のタむムゟヌンに䟝存しないように、日付ず時刻を操䜜する方法を説明したす。







参考たでに、以䞋はこのシリヌズの蚘事のリストです。







目次


泚1このコヌスの叀いバヌゞョンをお探しの堎合は、こちらをご芧ください 。







泚2私ミゲルの仕事を支持しお突然声をかけたい堎合、たたは1週間蚘事を埅぀忍耐がない堎合、私ミゲルグリヌンバヌグはこのガむドの完党版英語を電子曞籍たたはビデオの圢匏で提䟛したす。 詳现に぀いおは、 learn.miguelgrinberg.comをご芧ください 。







長い間無芖しおきた私のマむクロブログアプリケヌションの1぀の偎面は、日付ず時刻の衚瀺です。 これたでのずころ、PythonにUser



モデルのdatetime



オブゞェクトをマップさせ、 Post



モデルではそれを完党に無芖させたした。







この章のGitHubリンク Browse 、 Zip 、 Diff 。







地獄のタむムゟヌン



サヌバヌでPython機胜を䜿甚しお、Webブラりザヌでナヌザヌに衚瀺される日付ず時刻を衚瀺するこずはお勧めできたせん。 次の䟋を考えおみたしょう。 私はこれを2017幎9月28日16:06に曞いおいたす。これを曞いおいる間の私のタむムゟヌンはPDTたたは必芁に応じおUTC-7です。 Pythonむンタヌプリタヌでは、次のものが埗られたす。







 >>> from datetime import datetime >>> str(datetime.now()) '2017-09-28 16:06:30.439388' >>> str(datetime.utcnow()) '2017-09-28 23:06:51.406499'
      
      





datetime.now()



呌び出すず、珟圚地の正しい時刻が返され、 datetime.now()



呌び出すず、UTCタむムゟヌンの時刻が返されたす。 䞖界のさたざたな地域に䜏む人々にこのコヌドを同時に実行するように䟝頌できる堎合、 datetime.now()



関数は各人に察しお異なる結果を返したすが、 datetime.utcnow()



は垞に単䞀の倀を返したす同時に、堎所に関係なく。 それで、どのオプションが䞖界䞭のナヌザヌが利甚できる可胜性が高いWebアプリケヌションで最もよく䜿甚されるず思いたすか







明らかに、サヌバヌは時間を管理する必芁がありたすが、これは堎所に䟝存したせん。 このアプリケヌションが開発され、䞖界䞭のさたざたな地域で耇数の運甚サヌバヌを䜿甚する必芁が生じた堎合、各サヌバヌがさたざたなタむムゟヌンに埓っおタむムスタンプをデヌタベヌスに曞き蟌むこずは望たしくありたせん。 UTCは最もよく䜿甚される統䞀タむムゟヌンであり、 datetime



クラスでサポヌトされおいるため、これが必芁です。 そしお、私はそれを䜿甚したす。







ただし、このオプションでは、1぀の重芁な問題が発生したす。 異なるタむムゟヌンのナヌザヌの堎合、UTCタむムゟヌンの時刻を芋るず、実際に蚘録が行われた時期を刀断するのは困難です。 時間はUTCで衚瀺されるこずを事前に理解する必芁があり、時間垯に合わせお時間を粟神的に調敎できる必芁がありたす。 PDTタむムゟヌンで午埌3時に䜕かを送信したナヌザヌが、メッセヌゞが22:00たたはより正確には22:00のUTC時間で衚瀺されるこずをすぐに確認したずしたす。 わかりにくいでしょう。







UTCタむムスタンプの暙準化はサヌバヌの芳点からは非垞に理にかなっおいたすが、ナヌザヌにずっお䜿いやすさは難しくなりたす。 この章の目暙は、サヌバヌで管理されおいるすべおのタむムスタンプをUTCで保存するこずにより、この問題を解決するこずです。







タむムゟヌン倉換



この問題の明らかな解決策は、すべおのタむムスタンプをUTCから各ナヌザヌの珟地時間に倉換するこずです。 これにより、サヌバヌは䞀貫性のためにUTCを䜿甚し続けるこずができ、ナヌザヌごずに調敎されたオンザフラむ倉換が利䟿性の問題を解決したす。 この゜リュヌションの耇雑さは、各ナヌザヌの堎所を決定するこずにありたす。







倚くのWebサむトには、ナヌザヌがタむムゟヌンを指定できる構成ペヌゞがありたす。 これには、タむムゟヌンのリストを含むドロップダりンリストをナヌザヌに衚瀺するフォヌムで新しいペヌゞを远加する必芁がありたす。 ナヌザヌは、登録の䞀郚ずしお最初にサむトにアクセスするずきに、タむムゟヌンを入力するように求められたす。







これは問題を解決する適切な゜リュヌションですが、オペレヌティングシステムで既に蚭定されおいる情報の䞀郚をナヌザヌに入力しおもらうのは少し奇劙です。 ロヌカルコンピュヌタヌからタむムゟヌン蚭定を芋぀けるこずができれば、より効率的なようです。







結局のずころ、Webブラりザヌはナヌザヌのタむムゟヌンを認識し、暙準のJavaScript APIを介しお提䟛したす。 JavaScriptを介しお利甚可胜なタむムゟヌン情報を䜿甚するには、実際には2぀の方法がありたす。









これで十分でない堎合、「新しい孊校」を支持する別の利点がありたす。 それをすべお行うオヌプン゜ヌスラむブラリがありたす







Moment.jsずFlask-Momentの玹介



Moment.jsは、考えられるすべおの曞匏蚭定オプションを提䟛するため、日付ず時刻をたったく異なるレベルに衚瀺するタスクを実行する小さなオヌプン゜ヌスのJavaScriptラむブラリです。 たた、少し前に、Flask-Momentを䜜成したした。これは、アプリケヌションにMoment.jsを簡単に組み蟌むこずができる小さなFlask拡匵機胜です。







それでは、Flask-Momentをむンストヌルするこずから始めたしょう。







 (venv) $ pip install flask-moment
      
      





この拡匵機胜は、通垞の方法でFlaskアプリケヌションに远加されたす。







app/__init__.py



のむンスタンスを䜜成したす。


 # ... from flask_moment import Moment app = Flask(__name__) # ... moment = Moment(app)
      
      





他の拡匵機胜ずは異なり、Flask-Momentはmoment.jsず連携するため、すべおのアプリケヌションテンプレヌトにこのラむブラリを含める必芁がありたす。 このラむブラリが垞に利甚できるように、ベヌステンプレヌトに远加したす。 これを行うには2぀の方法がありたす。 最も盎接的な方法は、ラむブラリをむンポヌトする<script>



タグを明瀺的に远加するこずです。 しかし、Flask-Momentは、 <script>



を生成するmoment.include_moment()



関数を提䟛するこずにより、さらに簡単なオプションを提䟛したす。







app / templates / base.htmlmoment.jsをベヌステンプレヌトに远加したす。


 ... {% block scripts %} {{ super() }} {{ moment.include_moment() }} {% endblock %}
      
      





ここで远加したscripts



ブロックは、Flask-Bootstrapベヌステンプレヌトによっお゚クスポヌトされた別のブロックです。 これは、JavaScriptむンポヌトを含める必芁がある堎所です。 このブロックは、ベヌステンプレヌトで定矩された䞀郚のコンテンツが既に含たれおいるずいう点で、前のブロックずは異なりたす。 私がやりたいのは、基瀎ずなるコンテンツを倱うこずなく、moment.jsラむブラリを远加するこずです。 これは、基本テンプレヌトのコンテンツを保存するsuper()



呜什を䜿甚しお実珟されたす。 super()



を䜿甚せずにテンプレヌトでブロックを定矩するず、ベヌステンプレヌトでそのブロックに察しお定矩されたコンテンツはすべお倱われたす。







Moment.jsを䜿甚する



Moment.jsは、ブラりザヌにアクセス可胜なmoment



クラスを提䟛したす。 タむムスタンプを䜜成するための最初のステップは、 ISO 8601圢匏で必芁なタむムスタンプを転送するこずにより、このクラスのオブゞェクトを䜜成するこずです 。 以䞋に䟋を瀺したす。







 t = moment('2017-09-28T21:45:23Z')
      
      





日付ず時刻の暙準ISO 8601圢匏に慣れおいない堎合、圢匏は次のずおりです {{ year }}-{{ month }}-{{ day }}T{{ hour }}:{{ minute }}:{{ second }}{{ timezone }}



。 UTCタむムゟヌンでのみ䜜業するこずを既に決めおいるので、最埌の郚分は垞にZ



であり、これはISO 8601暙準のUTCです。







moment



オブゞェクトは、さたざたな衚瀺オプション甚のメ゜ッドをいく぀か提䟛したす。 以䞋は、最も䞀般的なオプションの䞀郚です。







 moment('2017-09-28T21:45:23Z').format('L') "09/28/2017" moment('2017-09-28T21:45:23Z').format('LL') "September 28, 2017" moment('2017-09-28T21:45:23Z').format('LLL') "September 28, 2017 2:45 PM" moment('2017-09-28T21:45:23Z').format('LLLL') "Thursday, September 28, 2017 2:45 PM" moment('2017-09-28T21:45:23Z').format('dddd') "Thursday" moment('2017-09-28T21:45:23Z').fromNow() "7 hours ago" moment('2017-09-28T21:45:23Z').calendar() "Today at 2:45 PM"
      
      





この䟋では、2017幎9月28日21:45 UTCの行で初期化されたmoment



オブゞェクトを䜜成したす。 䞊蚘で詊したすべおのパラメヌタヌは、コンピュヌタヌで構成されたタむムゟヌンであるUTC-7で衚瀺されおいるこずがわかりたす。 䞊蚘のコマンドをブラりザヌのコン゜ヌルに入力しお、コン゜ヌルを開くペヌゞにmoment.jsが含たれおいるこずを確認できたす。 䞊蚘の倉曎を行った堎合、moment.jsを含めるこずで、 https //momentjs.com/でマむクロブログでこれを行うこずができたす 。







異なるメ゜ッドが異なるビュヌを䜜成する方法に泚目しおください。 format()



、Pythonのstrftime関数に䌌た圢匏名文字列を䜿甚しお出力圢匏を制埡したす。 fromNow()



およびcalendar()



メ゜ッドは、珟圚の時刻に関連するタむムスタンプを衚瀺するずいう点で興味深いので、「1分前」や「2時間埌」などの出力行を取埗したす。







JavaScriptで盎接䜜業しおいる堎合、䞊蚘の呌び出しはタむムスタンプを衚瀺する文字列を返したした。 したがっお、このテキストをペヌゞの適切な堎所に远加するには、JavaScriptを䜿甚しおDOMを操䜜する必芁がありたす 。 Flask-Moment拡匵機胜によりmoment.jsの䜿甚が倧幅に簡玠化され、テンプレヌトに必芁なJavaScriptマゞックを含むmoment



オブゞェクトを含めお、ペヌゞに正しい方法で時間を衚瀺できたす。







プロファむルペヌゞに衚瀺されるタむムスタンプを芋おみたしょう。 珟圚のuser.htmlテンプレヌトにより、Pythonは時間の文字列衚珟を生成できたす。 次のように、Flask-Momentを䜿甚しおこのタむムスタンプを䜜成できたす。







app / templates / user.htmlmoment.jsを䜿甚したタむムスタンプ。


  {% if user.last_seen %} <p>Last seen on: {{ moment(user.last_seen).format('LLL') }}</p> {% endif %}
      
      





ご芧のずおり、Flask-MomentはJavaScriptラむブラリの構文に䌌た構文を䜿甚したすが、わずかな違いがありたすが、 moment()



匕数はISO 8601文字列ではなくPython datetime



オブゞェクトになりたす。たた、DOMの目的の堎所にレンダリングされたラベルを挿入するために必芁なJavaScriptコヌドを自動的に生成したす。







Flask-Momentずmoment.jsを䜿甚できる2番目の堎所は、 _post.html



サブテンプレヌトです。これは、むンデックスずナヌザヌペヌゞから呌び出されたす。 テンプレヌトの珟圚のバヌゞョンでは、各メッセヌゞの前に「username sayss」ずいう行がありたす。 fromnow()



を䜿甚しおタむムスタンプを远加できたす。







app / templates / _post.htmlメッセヌゞサブパタヌンのタむムスタンプ。


  <a href="{{ url_for('user', username=post.author.username) }}"> {{ post.author.username }} </a> said {{ moment(post.timestamp).fromNow() }}: <br> {{ post.body }}
      
      





これは、Flask-Momentずmoment.jsでレンダリングされたずき、これらのタむムスタンプの䞡方がどのように芋えるかです













翻蚳者からのPS



突然、私のように、英語以倖の蚀語、たずえばロシア語で日付を衚瀺する必芁がある堎合。 フラスコモヌメント拡匵には、この目的のためにlang()



メ゜ッドがありたす。













app / templates / base.htmlベヌステンプレヌトのmoment.jsブロックにlangメ゜ッドを远加したした。


 ... {% block scripts %} {{ super() }} {{ moment.include_moment() }} {{ moment.lang('ru') }} <!--     --> {% endblock %}
      
      





ここに 戻る








All Articles