day53ルーティング層 - 既知の未知のパケット逆DNS名前空間擬似スタティックルーティング分散仮想環境ビュー層ビュー

簡単な紹介

あなたは、インデックスにアクセスするとき/インデックスおよび/インデックス/?ID = 1のみマッチの試合と同じです

?そして&取得方法は、データを運ぶことがあります

パラメータ・サイズのGETリクエストは限らを運びます

request.GET GETすべてのデータは、要求が、そのようなインデックスに戻って運ぶために得る
?ID = 1&ユーザ名=かま

Djangoのリクエストのライフサイクル

テーブルとテーブルの関係の間で構築された
ライブラリ管理システム、例えば
図書テーブル
書籍や出版社は、組み込みに-多くされている外部キーフィールドブックテーブルに
書籍や著者多対多の関係は、3番目のレコードを必要としています

プレステーブル
テーブルの

テーブルとの間に表のDjangoのORMのビルド関係
(=「公開」まで)多くのForeignKey

(= 'AuthorDetail' への)一つOneToOneField

多くのManyToManyField(=「著者」まで)に多くの

注意:
最初の二つのキーワードが自動的に再び_idフィールドプラスになる
最後のキーは、実際のフィールドを生成しないだけで、自動的に3番目のテーブルを作成し、ORM Djangoに教えます

レイヤルーティング層のURL

url()実際には、正規表現で、最初のパラメータの方法

コンテンツにマッチした前回の定期的な試合をダウン続けますが、直接ダウンビューに対応した機能を実行しないであろうしたら

あなたのプロジェクトが特に大きい場合ため、上記の特性により、ご注文を書いて人々を考慮して、URLを調整する必要があり、そうでない状況では、URL障害を発生しやすいです

ソリューション:増加の背後にあります/

なぜ、あなたは明らかに訪れたときに、最終的な表面に入らなかった/が、アドレスバーの後ろにあるでしょうか/

最初の試合は増加しません:順序があるため、/一致しない場合は、返されたステータスコードは301で、プラス二度目はなり/たステータスコードが200であれば、それはそれを見つけることができない場合は、してみてください文句を言うでしょう

あなたはこのメカニズムをキャンセルしたい場合は、2番目の試合を望んでいない、設定は、設定ファイルで指定することができます

APPEND_SLASH = False  # 该参数默认是True

パケット

あなたが^追加しない場合、それは最初に処方されていない場合、あなたの要求として長いテストの最後として、テストがアクセスできるようになります

何も定義されて終わりがないので^先代も、欠陥がある、それは、所定の終了$を取りました

最後になりました

url(r'^test/$', views.test),

あなたはホームを持つようにしたい場合は

即ち

url(r'^$', views.home),

あなたは404ページをしたい場合は、最後に次の文を入れて(一般的にそうしていない、ライン上で知っています)

url(r' ', views.home),

不明グループ

url(r'^test/([0-9](4))$', views.test),

ルートは正規表現の括弧に一致ビュー自体は、位置パラメータとしてコンテンツにマッチします

test(request,2019)

有名なグループ化

url(r'^test/(?P<year>\d+)/', views.test)

パケットをマッチングすると、ビュー関数に渡されたキーパラメータとして使用、括弧コンテンツに知られているであろう

test(requesr,year=2019)

あなたは有名無名の混在はできますか?

:不能

これは一例であり、次のように文句を言うでしょう

url(r'^test/(\d+)/(?P<year>\d+)/', views.test),  # 这是会出错的

パケット同じで、例えば複数の、:

複数の無名のグループのサポート

url(r'^test/(\d+)/(\d+)/', views.test),

複数のよく知られたグループのサポート

url(r'^test/(?P<year>\d+)/(?P<xx>\d+)/', views.test),

逆引き参照

自然:実際には、対応するURLを返すためにあなたのリターンアドレスを与えるために、

1.ビュー機能とは対応関係のURLエイリアスを与えます

url(r'^index/$',views.index,name='kkk')

同じアプリで、別名が繰り返されないことに注意してください!

2.逆解析を実現するために、

バックエンドの逆引き

後端は、URLによって任意の位置で解析され、逆に対応する逆にしてもよいです

from django.shortcuts import render,HttpResponse,redirect,reverse
reverse('kkk')      

フロントエンド逆引き

{% url 'kkk' %}

文字列を直接のimportlibので、インポートポイントをインポートする必要はありません。

无名分组反向解析
url(r'^index/(\d+)/$',views.index,name='kkk')
后端反向解析
        reverse('kkk',args=(1,))  # 后面的数字通常都是数据的id值
前端反向解析
        {% url 'kkk' 1%}   # 后面的数字通常都是数据的id值

ルートの配布

ときに、あなたのDjangoのプロジェクト、特に大規模なルーティング機能は、特に特別な関係を視野に対応するとき
、あなたの総ルーティングコードはurls.pyを維持するにはあまりにも長く困難です

各アプリケーションは、独自のurls.py、静的フォルダ、テンプレートフォルダ(******)を持つことができます

これは、上記の条件を達成することができる以上であり、多くのグループが開発し、開発が完了した後、我々は単に空のDjangoベースのプロジェクトを作成する必要があります
(その後、人々は流通経路が、全体的なルートと一致しないルートを達成するために開発されたすべての登録済みのアプリに来ます私はあなたに対応するアプリに配布与えるだけで来た後)

あなたが別のPYファイルを構築するためにどのセグメンテーション機能に応じてフォルダビューをアプリケーション内の特別なビュー機能を構築することができ、特に(重要------ ------)

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/',include('app01.urls')),
        url(r'^app02/',include('app02.urls')),
    ]

名前空間(理解)

自動的に接頭語逆引き参照でアプリケーションを識別しません。この時点で、同じエイリアスからのより多くのアプリは
、あなたがこの問題を回避したい場合に発生します

モード1(比較的面倒であるが、ロジックをクリアすることができます):

総ルート

url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))

ときにバックエンドの分析

reverse('app01:index')
reverse('app02:index')

フロントエンドは、解析された場合

{% url 'app01:index' %}
{% url 'app02:index' %}

モード2(という名前のシンプルなデザートを滞在するには、この時間):

あなたは、一般的に再生することができたときにエイリアスを競合していないときには、一般的に接頭辞として別名を使用することをお勧めしますので、

name = 'app01_index'
name = 'app02_index'

擬似静的

方法:URL内へのインデックス/ index.htmlをで一致

静的ページ:データが同じ年に死ぬために書かれています

Baiduのと、他の検索エンジンのSEOの努力クエリを高めるために設計された擬似静的なページ

すべての検索エンジンは、実際には巨大なクローラーです

本当にあなたのウェブサイトの確率を高めることができ、擬似静的で関連のウェブサイトの最適化を行う照会されている
が、その後どのようにも到着した人民元のプレーヤーを最適化するために、しかし(Baiduの広告費に最も効果的なもの)

仮想環境

通常の状況下で、我々は必要ありません必要な項目で各プロジェクトのモジュールを与えると、インストールされません
各プロジェクトに合わせた仮想環境は、インタプリタ環境に似ています

それぞれの仮想環境を作成し、新しいPythonインタプリタをダウンロードしたいと思います

Djangoのバージョンの違い

ジャンゴ1.XとDjango 2.X差

        路由层1.X用的是url
        而2.X用的是path

正確に受信したと一致したDjangoの2.Xデフォルトのパス、パス

最初のパラメータを使用してDjangoの1.Xは、URLの正規表現を受信します

あなたが使用されていない2.Xを使用すると、2.Xも一貫したURLのre_path、re_path 1.xおよび使用法と呼ばれます

2.Xはパスが正規表現をサポートしていませんが、それは5つのデフォルトのコンバータを提供していますが

        1.X版本的url和2.X版本的re_path分组出来的数据都是字符串类型
        默认有五个转换器,感兴趣的自己可以课下去试一下
        str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
        int,匹配正整数,包含0。
        slug,匹配字母、数字以及横杠、下划线组成的字符串。
        uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
        path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

パスの使用例

        path('index/<int:id>/',index)  # 会将id匹配到的内容自动转换成整型

また、カスタムコンバータをサポートしています

        class FourDigitYearConverter:  
        regex = '[0-9]{4}'  
        def to_python(self, value):  
            return int(value)  
        def to_url(self, value):  
            return '%04d' % value  占四位,不够用0填满,超了则就按超了的位数来!
        register_converter(FourDigitYearConverter, 'yyyy')  
        
        urlpatterns = [  
                path('articles/2003/', views.special_case_2003),  
                path('articles/<yyyy:year>/', views.year_archive),  
                ...  
            ]  

ビュービュー層

1.ホワイトは3つの軸れる
①のHttpResponse
②レンダリング
リダイレクト③
Djangoのビュー関数が返しますのHttpResponseを与える必要があります

実際には、レンダリングしたHttpResponseから継承されているリダイレクト

別個の前部および後部が終了
ヒト幹(カスタマイズされたオブジェクトに遠位ターン)フロントエンドを
JSON.stringify()json.dumps()
JSON.parse()json.loads()
はPythonと他の乾燥(後端部の後端辞書は)
限りのデータ交換など、一般的に使用されているJSON形式
のバックエンドは大きな取得するために辞書を呼び出すためのインタフェースフロントエンドインターフェイスを生成するための唯一の責任がある
だけで、詳細辞書に記述した文書を記述する必要がバックエンドのインターフェースを情報と引数の送信

2.JsonReponse

from django.http import JsonResponse
def index(request):
        data = {'name':'我从未见过如此厚颜无耻之人','password':123}
        l = [1,2,3,4,5,6,7,8]
        # res = json.dumps(data,ensure_ascii=False)
        # return HttpResponse(res)
        # return JsonResponse(data,json_dumps_params={'ensure_ascii':False})
        return JsonResponse(l,safe=False)  # 如果返回的不是字典 只需要修改safe参数为false即可

3.ファイルのアップロード

事項は、ファイルをアップロードするためのフォームを形成します
1.enctypeがいるFormDataをデフォルトから変更必要にURLエンコード
GETデフォルトのポストから変更2.methodニーズを
まだ考慮すべきは、(コメントCSRFミドルウェアの設定ファイルを投稿するための要求を提出する必要があります)

フォームフォームは、ファイルバックエンドのデータファイルをアップロードする場合はPOSTむしろそこrequest.FILESに取得する必要があります

request.method
request.GET
request.POST
request.FILES
request.path  # 只回去url后缀 不获取?后面的参数
request.get_full_path()  # 后缀和参数全部获取

FBVとCBV(---重要---)

おすすめ

転載: www.cnblogs.com/PowerTips/p/11536573.html