目次
シングルトン パターン
ホームページ バックエンド開発 Python チュートリアル Django 管理ソース コードの分析 (例付き)

Django 管理ソース コードの分析 (例付き)

Oct 08, 2018 pm 03:56 PM
django

この記事の内容は、Django 管理者のソース コードの分析 (例付き) に関するものであり、一定の参考価値があります。必要な友人が参照することができます。お役に立てれば幸いです。

シングルトン パターン

シングルトン パターンは、一般的に使用されるソフトウェア デザイン パターンであり、このパターンの主な目的は、特定のクラスのインスタンスが 1 つだけ存在することを保証することです。シングルトン オブジェクトは、システム全体で特定のクラスのインスタンスを 1 つだけ表示したい場合に便利です。

たとえば、サーバー プログラムの構成情報はファイルに保存され、クライアントは AppConfig クラスを通じて構成ファイルの情報を読み取ります。プログラムの実行中に構成ファイルの内容をさまざまな場所で使用する必要がある場合、つまり、AppConfig オブジェクトのインスタンスをさまざまな場所で作成する必要がある場合、複数の AppConfig インスタンス オブジェクトが存在することになります。特に構成ファイルに多くのコンテンツが含まれている場合、メモリ リソースが大幅に浪費されます。実際、AppConfig のようなクラスの場合、プログラムの実行中にインスタンス オブジェクトが 1 つだけ存在することが望まれます。

Python では、さまざまなメソッドを使用してシングルトン パターンを実装できます。

  • #__new__()

  • ## を使用します。モジュールを使用します

  • #デコレータを使用します

  • #メタクラスを使用します

1. __new__() メソッドを使用します

クラスのインスタンスを 1 つだけ表示するには、

__new__() を使用してインスタンスの作成プロセスを制御します。コードは次のとおりです:

__new__() メソッドはインスタンス オブジェクトの作成に使用されます

__init__() メソッドはインスタンス オブジェクトの初期化に使用されます

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        print(1)
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, name, age):
        print(2)
        self.name = name
        self.age = age
if __name__ == '__main__':
    p1 = Person("djb", 18)
    p2 = Person("djb", 18)

    print(p1 == p2)
    print(id(p1), id(p2))

    print("=" * 120)

    s1 = Singleton("djb", 18)
    s2 = Singleton("djb", 18)
    print(s1 == s2)
    print(id(s1), id(s2))
ログイン後にコピー

2. モジュール メソッドを使用します

実際、Python モジュールはNatural シングルトン モード。初めてモジュールをインポートすると .pyc ファイルが生成され、2 回目にインポートすると、モジュール コードを再度実行せずに .pyc ファイルが直接ロードされます。したがって、シングルトン オブジェクトを取得するには、モジュール内で関連する関数とデータを定義するだけで済みます。

本当にシングルトン クラスが必要な場合は、これを行うことを検討できます:

class Singleton(object):    
def __init__(self, name, age):
        self.name = name
        self.age = age
p1 = Singleton("djb", 18)
ログイン後にコピー

次のコードを使用してテストします:

from singleton import p1

print(id(p1))
print(p1.name)
p1.name = "Bob"

from singleton import p1

print(id(p1))
print(p1.name)
ログイン後にコピー

残りの 2 つの型を自分で確認してください。 ..

管理者実行プロセス

<1>登録されているすべてのアプリでの admin.py ファイルのロードと実行のサイクル

def autodiscover():
    autodiscover_modules(&#39;admin&#39;, register_to=site)
ログイン後にコピー

<2>実行コード

#admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ("title",&#39;publishDate&#39;, &#39;price&#39;)
admin.site.register(Book, BookAdmin) 
admin.site.register(Publish)
ログイン後にコピー

<3> admin.site

##ここで適用されるのはシングルトン モードです。AdminSite クラスのシングルトン モードの場合、各 admin.site が実行されます。各アプリのオブジェクトは、

<4> 登録メソッドを実行します

admin.site.register(Book, BookAdmin) 
admin.site.register(Publish)
ログイン後にコピー
class ModelAdmin(BaseModelAdmin):pass
def register(self, model_or_iterable, admin_class=None, **options):
    if not admin_class:
            admin_class = ModelAdmin
    # Instantiate the admin class to save in the registry
    self._registry[model] = admin_class(model, self)
ログイン後にコピー

これで登録は完了です。

<5> 管理者の URL 設定

urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
]
ログイン後にコピー
class AdminSite(object):
    
     def get_urls(self):
        from django.conf.urls import url, include
        urlpatterns = []
        # Add in each model&#39;s views, and create a list of valid URLS for the
        # app_index
        valid_app_labels = []
        for model, model_admin in self._registry.items():
            urlpatterns += [
                url(r&#39;^%s/%s/&#39; % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
            ]
            if model._meta.app_label not in valid_app_labels:
                valid_app_labels.append(model._meta.app_label)
        return urlpatterns
    @property
    def urls(self):
        return self.get_urls(), &#39;admin&#39;, self.name
ログイン後にコピー

<6> url() メソッドの拡張適用

from django.shortcuts import HttpResponse
def test01(request):
    return HttpResponse("test01")
def test02(request):
    return HttpResponse("test02")
urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
    url(r&#39;^Xadmin/&#39;, ([
                    url(r&#39;^test01/&#39;, test01),
                    url(r&#39;^test02/&#39;, test02),

                    ],None,None)),
]
ログイン後にコピー

拡張機能の最適化

from django.conf.urls import url,include
from django.contrib import admin
from django.shortcuts import HttpResponse
def change_list_view(request):
    return HttpResponse("change_list_view")
def add_view(request):
    return HttpResponse("add_view")
def delete_view(request):
    return HttpResponse("delete_view")
def change_view(request):
    return HttpResponse("change_view")
def get_urls():
    temp=[
        url(r"^$".format(app_name,model_name),change_list_view),
        url(r"^add/$".format(app_name,model_name),add_view),
        url(r"^\d+/del/$".format(app_name,model_name),delete_view),
        url(r"^\d+/change/$".format(app_name,model_name),change_view),
    ]
    return temp
url_list=[]

for model_class,obj in admin.site._registry.items():
    model_name=model_class._meta.model_name
    app_name=model_class._meta.app_label

    # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
    temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
    url_list.append(temp)

urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
    url(r&#39;^Xadmin/&#39;, (url_list,None,None)),
]
ログイン後にコピー

以上がDjango 管理ソース コードの分析 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Djangoのバージョンを確認する方法 Djangoのバージョンを確認する方法 Dec 01, 2023 pm 02:25 PM

Django のバージョンを確認する手順: 1. ターミナルまたはコマンド プロンプト ウィンドウを開きます; 2. Django がインストールされていることを確認します Django がインストールされていない場合は、パッケージ管理ツールを使用してインストールし、 pip install django コマンドを入力します。 3. インストールが完了したら、python -m django --version を使用して Django のバージョンを確認できます。

Django vs. Flask: Python Web フレームワークの比較分析 Django vs. Flask: Python Web フレームワークの比較分析 Jan 19, 2024 am 08:36 AM

Django と Flask はどちらも Python Web フレームワークのリーダーであり、それぞれに独自の利点と適用可能なシナリオがあります。この記事では、これら 2 つのフレームワークを比較分析し、具体的なコード例を示します。開発の概要 Django はフル機能の Web フレームワークであり、その主な目的は、複雑な Web アプリケーションを迅速に開発することです。 Django は、ORM (オブジェクト リレーショナル マッピング)、フォーム、認証、管理バックエンドなどの多くの組み込み機能を提供します。これらの機能により、Django は大規模なデータを処理できるようになります。

Django フレームワークの長所と短所: 知っておくべきことすべて Django フレームワークの長所と短所: 知っておくべきことすべて Jan 19, 2024 am 09:09 AM

Django は、Web 開発ライフサイクルのあらゆる側面をカバーする完全な開発フレームワークです。現在、このフレームワークは世界中で最も人気のある Web フレームワークの 1 つです。 Django を使用して独自の Web アプリケーションを構築する場合は、Django フレームワークの長所と短所を理解する必要があります。具体的なコード例も含め、知っておくべきことはすべてここにあります。 Django の利点: 1. 迅速な開発 - Django は Web アプリケーションを迅速に開発できます。豊富なライブラリと内部を提供します。

Djangoのバージョンを確認する方法 Djangoのバージョンを確認する方法 Nov 30, 2023 pm 03:08 PM

Django のバージョンを確認する方法: 1. コマンド ラインで確認するには、ターミナルまたはコマンド ライン ウィンドウで「python -m django --version」コマンドを入力します。 2. Python 対話型環境で確認するには、「import django」と入力します。 print(django.get_version())" code; 3. Django プロジェクトの設定ファイルを確認し、インストールされているアプリケーション情報を含む INSTALLED_APPS という名前のリストを見つけます。

Django のバージョンの違いは何ですか? Django のバージョンの違いは何ですか? Nov 20, 2023 pm 04:33 PM

違いは次のとおりです。 1. Django 1.x シリーズ: これは、バージョン 1.0、1.1、1.2、1.3、1.4、1.5、1.6、1.7、1.8、および 1.9 を含む、Django の初期バージョンです。これらのバージョンは主に基本的な Web 開発機能を提供します; 2. Django 2.x シリーズ: これは、2.0、2.1、2.2 およびその他のバージョンを含む Django の中期バージョンです; 3. Django 3.x シリーズ: これは最新バージョンですDjango シリーズ。バージョン 3.0、3 などを含む。

Django バージョンをアップグレードする方法: 手順と考慮事項 Django バージョンをアップグレードする方法: 手順と考慮事項 Jan 19, 2024 am 10:16 AM

Django バージョンをアップグレードする方法: 手順と考慮事項、必要な特定のコード例 はじめに: Django は、より優れたパフォーマンスとより多くの機能を提供するために継続的に更新およびアップグレードされる強力な Python Web フレームワークです。ただし、古いバージョンの Django を使用している開発者にとって、Django のアップグレードはいくつかの課題に直面する可能性があります。この記事では、Djangoのバージョンアップの手順や注意点、具体的なコード例を紹介します。 1. Djan をアップグレードする前にプロジェクト ファイルをバックアップします。

Django はフロントエンドですか、それともバックエンドですか? Django はフロントエンドですか、それともバックエンドですか? Nov 21, 2023 pm 02:36 PM

バックエンドは django です。詳細: Django は主にバックエンド フレームワークですが、フロントエンド開発と密接に関連しています。 Django のテンプレート エンジン、静的ファイル管理、RESTful API などの機能を通じて、フロントエンド開発者はバックエンド開発者と協力して、強力でスケーラブルな Web アプリケーションを構築できます。

Django、Flask、FastAPI: 初心者に適したフレームワークはどれですか? Django、Flask、FastAPI: 初心者に適したフレームワークはどれですか? Sep 27, 2023 pm 09:06 PM

Django、Flask、FastAPI: 初心者に適したフレームワークはどれですか?はじめに: Web アプリケーション開発の分野では、優れた Python フレームワークが数多くあります。この記事では、最も人気のある 3 つのフレームワーク、Django、Flask、および FastAPI に焦点を当てます。それらの機能を評価し、初心者が使用するのに最適なフレームワークについて説明します。同時に、初心者がこれらのフレームワークをよりよく理解できるように、いくつかの具体的なコード例も提供します。 1.ジャンゴ:ジャンゴ

See all articles