flashkフレームurlとリダイレクト操作例詳細


本明細書の例は、flashkフレームurlとリダイレクト動作を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
1.urlと関数のマッピング
flashkプロジェクトを新規作成すると、デフォルトでハローがあります。world関数は、次のようになります。

@app.route('/')
def hello_world():
  return 'hello world'

上記の関数の中で、app.route()のパラメータは私達のurlです。プロジェクトを開始する時、私達はブラウザに127.1.0.1:5000を入力して、私達のこのビューにアクセスできます。
私たちはapp.route()のパラメータを'/hello/'に変更すると、このビューにアクセスするには、URLを入力して127.1.0.1:5000/hello/を入力してから、私たちのこのビューにアクセスできます。
これはflashkのurlと関数のマッピングです。
2.url着信パラメータ
  • urlにはパラメータ
  • が含まれています。
    CSDN、ブログ園、略書などのウェブサイトの記事の詳細を訪問すると、各記事の開始ページのurlの前に封緘しないのは同じです。後ろの部分だけが違っています。この異なる部分は一つのパラメータとしてビューに入ることができます。そして、対応するパラメータをビューで入手して対応する操作を行い、該当するデータを返します。flashkではこの機能はどうやって実現されますか?
    
    @app.route('/article_detail/<article_id>/')
    def article_detail(article_id):
      return "      id   %s" % article_id
    
    
    上の関数ビューでは、app.route()でこのパッケージを使用して私たちが定義したパラメータです。ここでは、articale gauを定義します。idのようなパラメータです。私たちはurlにパラメータを定義した後、このパラメータを関数にも書き込む必要があります。パラメータ名はurlのパラメータ名と一致していなければなりません。そして、私たちは図の中でアートを手に入れることができます。IDというパラメータの値が出ました。
    そしてアイテムを起動し、ブラウザに127.1.0.1:5000/articale_を入力します。detail/3/など似たようなurlは、それなりの効果が見られます。
    上記の例では、urlを介して関数ビューにパラメータを入力することができますが、私たちはurlに対してタイプ制限をすることはできません。IDは必ず一つのintデータである必要があります。ユーザが入ってきたパラメータがint型のデータではない場合、彼は私たちのこの関数ビューにアクセスできません。404ページが現れます。flashkではどうやってこのような要求を実現しますか?
    flashkでは、urlに対してタイプを指定できます。
    
    @app.route('/article_detail/<int:article_id>/')
    def article_detail(article_id):
      return "      id   %s" % article_id
    
    
    このようにして、私たちは入ってきたパラメータに対して、タイプ制限をしました。パラメータの前にタイプを書いてください。
    flashkでは、intタイプに加えて、以下のタイプがサポートされています。
  • string:デフォルトのデータタイプは、任意のスラッシュ/文字列を受け入れます。
  • int:整形
  • float:浮動小数点型。
  • path:stringと似ていますが、スラッシュを渡すことができます。
  • uuid:uuidタイプの文字列。何がuuidですか?)
  • any:複数のパスを指定できます。これは一例で説明します。
  • 
    @app.route('/<any(blog,article):url_path>/<int:id>/')
    def detail(url_path,id):
      if url_path == 'blog':
        return 'blog detail is ' + str(id)
      else:
        return 'article detail is ' + str(id)
    
    
    このように、私達はブラウザに127..0.1:5000/blog/3/または127..0.1:5000/articale/3/いずれもこのビューにアクセスできます。では、どのように現在のurlでアクセスしているかを知ることができますか?この値を受け入れるためにpathパラメータを使用して、そして私たちもビューにこのパラメータを書き込みます。そして私たちはこの値を手に入れることができます。
  • urlにおいて、パラメータ(get要求)
  • を照会文字で送る。
    ある時、私達は上のようにパラメーターを渡す必要がありません。通過しますか?xxx=xxxという形でパラメータを伝えます。
    flashkでは、このパラメータの値はどうやって得られますか?
    
    from flask import request
    @app.route('/search/')
    def search():
      name = request.args.get('name')
      return "          %s" % name
    
    
    例えば上記のビュー関数の中に、name=xxxを入力して、文字を検索して逃げ込みたいです。そうすると、私達は直接ブラウザに127.1.0.1:5000/search/?name=xxxを入力して、関数ビューの中でrequest.args.get()方法でこの値を得ることができます。
    もし私達のurlの中でnameというパラメータが入っていないならば、私達のプログラムも間違いなく報告して、Noneを得るだけで、私達のコードの運行に影響しません。
    3.構造url、url_forの使用
    上のコードでは、ブラウザにurlを入力することにより、私たちのビュー関数を見つけます。逆にしてもいいですね。ビュー関数を知って、それに応じてurlを得ることができます。
    この時は私達はurl_を使う必要があります。forです。まず私たちの先に導入します。
    
    from flask import url_for
    @app.route('/url_for/')
    def url_for_demo():
      return 'url_for_demo'
    @app.route('/index/')
    def index():
      #             
      return url_for('url_for_demo')
    
    
    クルクルforのパラメータは関数の名前ですが、入ってきた関数が存在しないとエラーが発生します。ブラウザに127.1.0.1:5000/index/を入力してみましょう。私たちはurl_を見ることができます。for_デモという関数に対応したurlです。パラメータのないurlで覚えましたが、urlの中にパラメータを持ってきたらどうなりますか?
    url_にいますforという関数では、私たちもキーワードパラメータに入ることができます。urlのパラメータに対応するだけでいいです。
    
    @app.route('/article/<int:article_id>/')
    def article_detail(article_id):
      return "article id is " + str(article_id)
    @app.route('/index/')
    def index():
      #             key      ,          url      
      url = url_for('article_detail',article_id=2)
      return url
    
    
    これで、私達もurl_にいることができます。forからurlのパラメータが入ってきました。
    もし私たちがウルルにいたらforからurlにはないキーワードパラメータが入ってきましたが、どうなりますか?
    
    @app.route('/article/<int:article_id>/')
    def article_detail(article_id):
      return "article id is " + str(article_id)
    @app.route('/index/')
    def index():
      #             key      ,          url      
      url = url_for('article_detail',article_id=2,name='xxx')
      return url
    
    
    私たちはこのurlを訪問すると、このようなurlに戻ります。
    つまり、私達がurlに入ってきた時にはない鍵となるパラメータです。forは検索文字で逃げればurlに追加されます。
    私たちの関数に対応するurlは何のために使いますか?
    クルクルforは普通リダイレクトと一緒に使うので、単独で使うのは普通ではないです。だから、次にリダイレクトします。
    4.リダイレクト
    リダイレクトは、永久リダイレクトと一時リダイレクトに分けられます。
  • 恒久的リダイレクト:httpの状態コードは301で、古いアドレスが破棄されたため、新しいアドレスに移動してユーザーのアクセスを確保する必要があります。例えば京東のサイトです。私たちはジンドング.comを入力すると、ブラウザは私たちにjd.comというウェブサイトにジャンプします。ジンドング.comはこのウェブサイトがすでに廃棄されていますので、jd.comにもう一度ジャンプしてください。これは永久リダイレクトです。
  • 一時的なリダイレクト:httpの状態コードは302で、ページの一時的なジャンプを表しています。例えば、あるウェブサイトで直接に個人センターページにアクセスしますが、ログインしていないので、直接にログインページにジャンプします。
  • flashkでは、リダイレクトを使うにはdirectという関数が必要です。
    リダイレクトの使用を一例で説明した。
    需要:私達は個人の中心に訪問する時、もし上陸していないならば、上陸のページにジャンプしなければならなくて、ここで私達はurlの中でnameパラメーターに入ったと仮定して、上陸したのだと思っています。コードは以下の通りです
    
    from flask import redirect,url_for
    @app.route('/login/')
    def login():
      return 'login'
    @app.route('/profile/')
    def profile():
      name = request.args.get('name')
      if name:
        return 'profile   '
      else:
        return redirect( url_for('login') )
    
    
    上のコードは私達の需要を実現しました。
    この時、「redirect関数」では、url cuuを使わなくてもいいです。for、直接手動構造urlを構築しても、特に面倒ではないです。例えば、このように。return redirect('login')です。これで私も直接ロゴページにジャンプできます。
    ここではざっとurl_を使うと言います。forのメリットですね
  • 私達のプロジェクトがとても大きい時、もしある日社長が私達を必要とするならば、urlを修正します。例えば、/index/を/xxx/index/に変更したら、私達はap.routeの中で修正しました。もし私達のプロジェクトで大量に使われているredirectが私達のこの関数ビューにリダイレクトすれば、コードの中の一つを探しに行かなければなりません。コードを修正します。もし私達がurl_を使ったら。for、じゃこのような問題はないです。直接に@app.routeを修正すればいいです。他のところは私達が使っているのはurl_です。forが生成されたので、私達が修正する必要はありません。
  • 私たちのurlに特殊な文字がある場合、'/'などのように直接手動でこのパラメータを構築すると、意味が違ってくる可能性があります。これ'/'はurlの'として認識しますか?それとも普通の文字として認識しますか?forなら、url_forは'/'を符号化して、私たちが使う時に割引して復号してきますので、翔の上のような状況は出ません。
  • 5.HTTP要求方法の指定
    いくつかの場合、我々のビューはPOSTメソッドのみにアクセスすることができます。一方、@app.route()はデフォルトではGET方法のみを許可しますが、どうやって要求を許可する方法を指定しますか?@app.route()において、本方法によってサポートされるHTTP方法を指定するキーワードパラメータmethodsが導入され得る。
    
    #    POST  
    @app.route('/post_demo/',methods=['POST'])
    def post_demo():
      return 'post'
    #          ,      get   ,         
    @app.route('/get_demo/',methods=['GET'])
    def get_demo():
      return 'get'
    # GET,POST     
    @app.route('/all_demo/',methods=['POST','GET'])
    def all_demo():
      return 'all'
    
    
    注意:@app.route('/index')@app.route('/index/')からは対応する二つのurlがあります。普通はプロジェクトの中で後ろの一つを使っています。いくつかのブラウザの中には、私たちの一番後ろに'/'が追加されていない場合、ブラウザは自動的に私たちに追加されます。このようなurlがありますか?だから、ページが見つからないかもしれません。だからプロジェクトの中で、私達は普通はいずれも後のような形に書きます。
    本稿で述べたいのですが、flashkフレームに基づくPythonプログラムの設計に役立ちます。