DjangoでURL短縮アプリを構築するためのガイド

公開: 2021-05-09

Djangoやその他のスキルを学ぶための最良の方法は、機能的なプロジェクトを作成して得た知識を応用することです。

Djangoは、最も使用されているPythonWeb開発フレームワークです。 その組み込み機能と大量のサードパーティパッケージにより、世界中で最も愛されているWebフレームワークの1つになっています。

高速で信頼性が高く、多くの機能が組み込まれています。 たとえば、アプリの主な機能に集中できるホール認証システム。 また、外部パッケージをインストールして、ユーザーをソーシャルアカウントに登録できるDjango-allauthなどのさらに複雑なタスクを実行することもできます。

しかし、いくつかの事実を明らかにしましょう。 Djangoは非常に巨大なフレームワークであるため、使い始めるのが難しい場合があります。

したがって、今日は、完全に機能するDjangoアプリケーションをゼロから構築します。

このチュートリアルの終わりまでに、次のことを行います。

  • URL短縮アプリを作成しました
  • DjangoMVTパターンを理解する
  • プロジェクトを作成するワークフローを学びました

前提条件

以下の要件はすべてオプションであり、チュートリアルに従うのに役立ちます。 ただし、これらのいずれも経験がなくても心配しないでください。 最も重要なステップは最初です。

  • UNIXコマンドの基本的な理解(ls、cd、rm、touch)
  • Pythonのクラスと関数の基本的な理解
  • あなたのコンピュータにインストールされたPython(多分明白ですが、私はそれを含めなければなりませんでした)
  • すでにDjangoで何かを構築しているといいですね

動作するすべてのコードは、このGithubリポジトリで利用できます。

これで前の概念が明確になったので、問題に取り掛かりましょう。

プロジェクトステートメント

このチュートリアルでは、URL短縮サービスを作成します。 基本的に、URL短縮サービスは長いURLを取り込んでコンパクトなものにするサービスです。

たとえば、ツイートを共有してWebサイトへのリンクを含めたいが、文字数の制限に直面している場合は、URL短縮サービスを使用できます。

グラフィックで見てみましょう。

URL短縮サービス

ご覧のとおり、URL短縮サービスは長いURLを取得し、短いURLを返します。 それはまさにあなたが今日構築しようとしているものです。

このプロジェクトでは、MVTパターンの使用法を練習し、Djangoモデルを使用したデータベース設計の基本を学び、ビュー、URL、およびテンプレートを介してユーザーに情報を表示する方法を学びます。

Djangoプロジェクトの構造

基本的に、Django Webサイトは、単一のプロジェクトと複数の個別のアプリに基づいて構築されています。 これらのアプリにはそれぞれ特定の機能があり、それ自体で動作することができます。

Stackoverflowのような複雑なWebアプリケーションを想像してみましょう。 その機能は、2つの主要な側面に基づいています。

  • ユーザー管理:サインイン、ログアウト、レピュテーション、権限
  • フォーラム:質問、回答、タグ、フィルター

したがって、Django Webサイトの構造に従って、プロジェクトの名前はStackOverflowになり、2つの主要なアプリがあります。 ユーザーのアプリとフォーラムのアプリ。

これらの各アプリには、自己完結型の機能があります。 つまり、両方に、正しく機能するために必要なすべてのコードが含まれています。

これには、モデル(データベース構造)、ビュー(要求と応答)、特定のURLパターン、そしてもちろん、テンプレートと静的ファイル(画像、CSS、JavaScript)が含まれます。 これは、Djangoアプリは自分で動作できるため、再利用できることを意味します。

短縮すると、プロジェクトとは、Webアプリケーションを構築するための一連の構成とアプリを指します。 一方、Djangoアプリはプロジェクトの一部であり、自己完結型(動作するために必要なすべてのものを備えています)であり、その目的は特定の操作を実行することです。

Djangoプロジェクトをセットアップする

このセクションでは、Djangoプロジェクトをセットアップします。 そのために、仮想環境などのさまざまなツールを使用して、Pythonの依存関係や最も重要なDjangoスクリプトを整理します。 Django-adminmanage.py

仮想環境

Djangoでアプリを構築するときは、常に仮想環境で作業することをお勧めします。 これは、特定の依存関係のセットを維持するための最も効率的な方法です。 ただし、その主な目的は、開発パッケージをグローバルパッケージから分離することです。

それでは、組み込みのformコマンドを使用して仮想環境を作成しましょう。

注:このメソッドが機能するには、Python3.6以降のバージョンが必要です。

 python -m venv .venv

このコマンドは、 python-mまたはpython–modコマンドを使用します。 基本的には、モジュールまたはライブラリをスクリプトとして実行します。 このコマンドの意味によると、venvは、私たちが実行していることをライブラリであり、そして.venvは、私たちが作成する仮想環境の名前を指します。

したがって、平易な言葉で、このコマンドは意味します。

Pythonさん、組み込みのライブラリvenvをスクリプトとして実行し、virtualenv名.venvを作成します。

次に、次のコマンドを使用して、作成したばかりの仮想環境をアクティブ化します。

 source .venv/bin/activate

新しいvenvにインストールされているパッケージがゼロであることを表明するには、を実行します。

 pip freeze

仮想環境を正しくアクティブ化した場合、出力は得られません。 まだ何もインストールしていないからです。

Djangoに入りましょう

URL短縮アプリケーションを作成するために、まずDjangoパッケージをインストールします。 Djangoはサードパーティのパッケージであるため、 Pip (Pipインストールパッケージ)を使用してインストールする必要があります。

 $ pip install django Collecting django Downloading Django-3.2.1-py3-none-any.whl (7.9 MB) |████████████████████████████████| 7.9 MB 344 kB/s Collecting asgiref<4,>=3.3.2 Using cached asgiref-3.3.4-py3-none-any.whl (22 kB) Collecting sqlparse>=0.2.2 Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB) Collecting pytz Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB) Installing collected packages: asgiref, sqlparse, pytz, django Successfully installed asgiref-3.3.4 django-3.2.1 pytz-2021.1 sqlparse-0.4.1

注: $はシェルシンボルにすぎないことに注意してください

インストールが正しく行われたかどうかを確認するために、venvのインストール済みパッケージを再度確認します。

 $ pip freeze asgiref==3.3.4 Django==3.2.1 pytz==2021.1 sqlparse==0.4.1

あなたが得るバージョンが私のものと異なっていても心配しないでください。 Djangoがバージョン3.xのままである場合は、問題なく続行できます。

Djangoプロジェクトの開始

Djangoをインストールしたら、URL短縮Webサイトの構造を作成します。 Djangoプロジェクトとは何か覚えていますか? 次のコマンドを実行して作成しましょう。

 django-admin startproject config

このコマンドのすべてを説明するdjango-adminは、Djangoプロジェクトを作成するために必要なすべてのタスクを実行するコマンドラインユーティリティです。 「startproject」の部分はDjango-adminユーティリティによって実行されるコマンドであり、 configは作成するプロジェクトの名前です。

configには任意の名前を付けることができることを強調することが重要です。 このプロジェクトの名前としてconfigを使用する理由は、便宜上です。 プロジェクトを切り替えても、同じ命名規則を使用できるのは便利です。 したがって、いつでも他のプロジェクト名を使用することを恐れないでください。

お気づきかもしれませんが、 config /フォルダーがあり、その中には多くのファイルがあります。 後で、プロジェクトのファイル構造を確認します。 今のところ、プロジェクトディレクトリに入り、ローカルサーバーを実行しましょう。

 cd config/

使用する最も重要なファイルはmanage.pyスクリプトです。 django-adminと同じ機能がありますが、これを使用する主な利点は、プロジェクトの実行時に設定を管理できることです。

次に、すべてが正しく機能しているかどうかを確認しましょう。

 python manage.py runserver

Djangoデモアプリ

URL短縮アプリの作成

プロジェクトのメインアプリを作成する時が来ました。 このタスクを実行するには、 manage.pyファイルを使用します。

 python manage.py startapp urlshortener

これにより、 urlshortenerという名前のDjangoアプリが作成されます。 treeコマンドを実行すると、次のようになります。

 . ├── config │ ├── asgi.py │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── urlshortener ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py

この時点までに作成されたさまざまなファイルを明確にしましょう。 「config」は私たちのプロジェクトの名前であり、慣例のためにそのように名前が付けられています。 設定の内部では、あなたが得るsettings.py 、それはあなたのプロジェクトのすべての設定を設定ファイルです。 urls.pyは、プロジェクト内のURLの全体的な構成です。 プロジェクト内のすべてのアプリケーションのURLパスを定義します。

あまり心配しないでくださいasgi.pywsgi.pyファイル。 これらは、デプロイメントでアプリケーションを構成できるようにするファイルです。

manage.pyは、Django-adminで使用可能なすべてのコマンドを実行できるようにするPythonスクリプトです。

作成したアプリの名前であるurlshortener内部を見ると、「migrations /」という奇妙なフォルダや、アプリのロジックに不可欠なその他のファイルがあることに気付くかもしれません。

apps.pyは、アプリ構成が存在する場所です。 通常、かなり高度なことをしている場合を除いて、それをいじることはありません。

admin.pyは、モデルを登録してDjango管理パネル内に表示できるようにする場所です。

models.pyは最も重要なものです。 このモジュール内で、モデルを定義する必要があります。モデルは(漠然と言っていますが)データの保存方法です。 モデルについては後で詳しく説明します。

migrations/は、Djangoの移行が保存されるフォルダーです。 後で詳しく見ていきます。

tests.pyは、テストが保存されているファイルです。 このチュートリアルでは、テストについては説明しません。

views.pyは、ビューを格納するファイルです。 基本的に、ユーザーがアプリのすべての側面をどのように操作するかを定義します。

Djangoアプリのインストール

続行する前に、 settings.pyファイルを開き、urlshortenerアプリを追加してINSTALLED_APPS変数を変更します。

 # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # Custom apps 'urlshortener', ]

これは、アプリを作成するときの日常的なプロセスです。 したがって、それを行うたびに、プロジェクト設定にインストールすることを忘れないでください。

MVTパターンを理解する

モデル、ビュー、テンプレートパターンは、Django開発者がWebアプリケーションを作成するために使用するソフトウェアデザインパターンです。

MVTパターン

これは、3つの主要な概念に基づいています。 モデル(データ)、ビュー(ユーザーによるデータの操作)、テンプレート(ユーザーによるデータの表示方法)。

モデルはPythonクラスであり、保存するデータのすべてのフィールドと動作を定義します。 通常、各モデルはデータベース上の一意のテーブルを参照します

最も単純な式のビューは、ユーザーからの要求を受け取り、応答を生成する呼び出し可能オブジェクトです。 そのプロセスの間にビジネスロジックが発生します。 「ビジネスロジック」はかなりあいまいな概念であることを私は知っているので、それが何であるかを正確に説明させてください。 ビジネスロジックは、データの作成、保存、削除の方法です。それだけです。

最後に、テンプレートはユーザーに表示されるテキストドキュメント(通常はHtml)です。 その目的は、データを可能な限りクリーンに表示することです。 Djangoには、Djangoテンプレート言語(DTL)と呼ばれるミニ言語が組み込まれています。これにより、Pythonの機能の一部をテキストドキュメントに組み込むことができます。

Shortenerモデルを作成する

MVTパターンを簡単に理解したら、DjangoURL短縮サービスを最初から作成してみましょう。

まず、 models.pyファイル内で短縮モデルを定義しましょう。

 ''' Url shortener model ''' from django.db import models # Create your models here. class Shortener(models.Model): ''' Creates a short url based on the long one created -> Hour and date a shortener was created times_followed -> Times the shortened link has been followed long_url -> The original link short_url -> shortened link https://domain/(short_url) ''' created = models.DateTimeField(auto_now_add=True) times_followed = models.PositiveIntegerField(default=0) long_url = models.URLField() short_url = models.CharField(max_length=15, unique=True, blank=True) class Meta: ordering = ["-created"] def __str__(self): return f'{self.long_url} to {self.short_url}'

知っている。 それはかなり巨大なクラスで、たくさんの奇妙なことが起こっていますが、絶望しないでください。 重要なことを一歩ずつ進めていきます。

モデル説明

まず、 modelsモジュールをインポートします。 このモジュールには、Djangoモデルを作成するために必要なすべての機能が含まれています。

「Shortener」モデルを見て、最初に注意することは、 models.Model拡張することmodels.Model 。 実際、Djangoアプリのモデルは、models.Modelクラスのサブクラスである必要があります。

次に、モデルがデータベース上に持つすべてのフィールドを定義します。 「作成済み」フィールドは短縮リンクが作成された日時であるため、 DateTimeFieldを使用してこの種の機能を作成します。 インスタンスの作成時にのみフィールドを変更する必要があるため、引数auto_now_add = Trueを使用します。

2番目のフィールドtimes_followedは、短縮URLが使用された回数を示します。 これはPositiveIntegerFieldであり、デフォルトのゼロを指定します。 つまり、インスタンスがtimes_followedフィールドを作成するtimes_followed 、Djangoはそのフィールドに0を入力します。

一方、 long_urlは、ユーザーが入力したURLを参照します。 :我々は唯一のユーザーがフォームの文字入力したいので、それは、URLFieldあるhttp://yoursite.com

最後のフィールドはshort_url 、興味深い詳細があります。 15文字までしか指定できず、一意である必要があります。つまり、そのフィールドに要素を繰り返すことはできません。 最後に、空白のままにできることを示します。これは、フォームを操作するときに、ユーザーが独自の短縮コードを記述する必要がないことを意味します。

Meta内部クラスは、クラスがどのように動作する必要があるかを示し、短縮オブジェクトの順序( Shortener.objects.all()を呼び出す)が最新のものによって識別されるように設定します。

__str__メソッドは、モデルの印刷方法を指示します。 したがって、long_url =“ https://geekflare.com/”で、部分が“ 123456”に短縮されたオブジェクトがある場合、それを印刷します。

 https://geekflare.com/ to 123456

次に、短いリンクをランダムに保存する方法を探します。

短縮機能の作成

2つのカスタム関数を作成します。 1つ目はランダムコードを生成し、2つ目はShortenerモデルからランダムコードが繰り返されるのを防ぎます。 これを行うには、「urlshortener」アプリ内にutils.pyファイルを作成します。

 touch utils.py

このファイル内では、ランダム組み込みモジュールの選択関数を使用します。 これにより、ランダムな文字を選択してコードを作成する作業が容易になります。

 ''' Utilities for Shortener ''' from django.conf import settings from random import choice from string import ascii_letters, digits # Try to get the value from the settings module SIZE = getattr(settings, "MAXIMUM_URL_CHARS", 7) AVAIABLE_CHARS = ascii_letters + digits def create_random_code(chars=AVAIABLE_CHARS): """ Creates a random string with the predetermined size """ return "".join( [choice(chars) for _ in range(SIZE)] )

ご覧のとおり、この関数は、設定ファイルで指定された長さ、またはデフォルトで7のランダムな文字列を返します。 関数getattrを使用して、設定モジュールから変数を取得していますが、変数が指定されていない場合はエラーをスローしません。

数学をやってみましょう。 各場所で最大62の使用可能な文字が存在する可能性がある7つの場所がある場合、可能な順列は次のとおりです。

したがって、これらの迅速な計算に基づいて、短縮された部分は最大2.5兆の異なるコードに入力できます。 したがって、ランダムな短縮URLから抜け出すことを忘れることができます。

このように多くの順列が存在する可能性がありますが、短縮された部分が繰り返される可能性はわずかです。 これは、 shortened_urlフィールドを一意に設定したため問題になります。 そのため、次の関数が非常に便利です。

 def create_shortened_url(model_instance): random_code = create_random_code() # Gets the model class model_class = model_instance.__class__ if model_class.objects.filter(short_url=random_code).exists(): # Run the function again return create_shortened_url(model_instance) return random_code

ここで何が起こっているのか見てみましょう。 この関数は、引数として「Shortener」モデルインスタンスを取ります。 まず、関数はcreate_random_codeを使用してランダムコードを生成します。 次に、モデルクラスを取得し、同じshort_urlを持つ他のオブジェクトがあるかどうかを確認します。 実行すると、もう一度実行されますが、すべてが正常であれば、random_codeが返されます。

後で、この関数を詳しく調べるために、シェルを操作します。

効用関数を作成したら、それを使用して短縮モデルでランダムコードを作成しましょう。

保存方法の変更

「Shortener」クラスの最後で、モデルの保存メソッドを変更します。 saveメソッドは、オブジェクトがデータベースに保存されるたびに呼び出されるため、ここでその使用方法を説明します。

 # Import the function used to create random codes from .utils import create_shortened_url # At the end of the Shortener model def save(self, *args, **kwargs): # If the short url wasn't specified if not self.short_url: # We pass the model instance that is being saved self.short_url = create_shortened_url(self) super().save(*args, **kwargs)

saveメソッドが上書きされています。つまり、既存の親メソッドに新しい機能が導入されています。 基本的に、「Shortener」オブジェクトが保存され、 short_urlが指定されていない場合は、ランダムなコードを入力する必要があることをDjangoに伝えています。

移行の実行

次に、Shortenerモデルの移行を作成して実行します。 これを行うには、ルートプロジェクトフォルダーで次のコマンドを実行します。

 $ python manage.py makemigrations Migrations for 'urlshortener': urlshortener/migrations/0001_initial.py - Create model Shortener $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, urlshortener Running migrations: ...... # Apply the URL shortener migrations Applying urlshortener.0001_initial... OK

今のところ、移行とは何かについて心配する必要はありません。 これらの2つのコマンドを実行するとき、Djangoは定義したモデルに基づいてdb.sqliteデータベースファイルを作成することを覚えておいてください。

Djangoシェルでいくつかのオブジェクトを作成しましょう。

 $ python manage.py shell >>> from urlshortener.models import Shortener >>> s = Shortener(long_url="https://geekflare.com") >>> s.short_url '' >>> s.save() >>> s.short_url 'kdWFVIc' >>> s.long_url 'https://geekflare.com' >>> print(s) https://geekflare.com to kdWFVIc

これは、すべての短いオブジェクトがどのように機能するかとほぼ同じです。

ビューを書く

前に述べたように、ビューは要求を受け取り、応答を返す単純な関数です。 それでは、HelloWorldビューを作成する方法を見てみましょう。

基本的なテンプレートの応答

「urlshortener / views.py」ファイル内に、関数home_viewを作成します。 aa

 ''' Shortener views ''' from django.shortcuts import render, get_object_or_404 # We will use it later from django.http import HttpResponse # Create your views here. def home_view(request): return HttpResponse("Hello world")

「Helloworld」という簡単なメッセージを返します。 後で、ブラウザでどのように表示されるかを確認できます。 ここで「urls.py」を作成します。アプリのすべてのURLパターンが表示されます。

touch urls.py

次のコードを追加します。

 ''' Urls for shortener app urlshortener/urls.py ''' from django.urls import path # Import the home view from .views import home_view appname = "shortener" urlpatterns = [ # Home view path("", home_view, name="home") ]

appname変数は、(その名前が示すように)urlshortenerアプリの名前空間を宣言します。

アプリのurlpatternsに含める要素を返すpath関数をインポートしていることを簡単に説明します。 name属性はパスの名前空間であり、必要に応じてテンプレート内で呼び出すことができます。

それでは、プロジェクトのURL全体を変更してみましょう。

 # config/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # Shortener Urls path('', include('urlshortener.urls')) ]

それでは、サーバーをもう一度実行してみましょう。

 python manage.py runserver

サーバーを実行すると、単純な「Helloworld」メッセージが表示されます。 これは、URL短縮アプリのurlpatternsをプロジェクト全体に含めているためです。

これは出発点にすぎません。 次に、ユーザーが自分で短縮URLを作成できるようにするフォームを作成します。

フォームの作成

Djangoでは、フォームはユーザーからの入力を取得できる単純なクラスです。

forms.pyファイルを作成します。 アプリのすべての形式をそのファイルに保存するのが慣例です。

 cd urlshortener/ touch forms.py

そのファイル内に、「ModelForm」から拡張されたクラス「ShortenerForm」を作成します。

 ''' Shortener Forms urlshortener/forms.py ''' from django import forms from .models import Shortener class ShortenerForm(forms.ModelForm): long_url = forms.URLField(widget=forms.URLInput( attrs={"class": "form-control form-control-lg", "placeholder": "Your URL to shorten"})) class Meta: model = Shortener fields = ('long_url',)

これは、ユーザー入力からモデルオブジェクトを作成することを目的としているため、モデルフォームです。 また、ウィジェット引数を使用して、「クラス」(PythonではなくCSSのクラス)属性を指定できるようにします。 これは、後でブートストラップを使用してアプリを定型化するためです。

ビューを終了する

フォームを作成したら、アプリケーションの最終的なビジネスロジックを作成します。

短縮アプリ内のviews.pyファイルに移動し、 home_viewビューを変更します。 この時点でGithubリポジトリをチェックして、プロジェクトの構造がどのようになっているのかを知ることができます。

URL短縮アプリには2つのビューがあります。

  1. ホームビュー:これは、短縮フォームと、フォームがすでに送信されている場合は新しいURLを表示します。
  2. ビューのリダイレクト:これは長いURLにリダイレクトし、その後の時間に1を追加します。

最も複雑なホームビューから始めましょう。 Shortenerモデルとフォームをインポートする必要があります。 ビューのすべてのデータフローを理解してほしいので、まだ関数を使用しています。 また、テンプレートのパスを使用します(まだ作成されていません)。

ホームビュー

''' Shortener views ''' from django.shortcuts import render # We will use it later from django.http import HttpResponse, Http404, HttpResponseRedirect # Model from .models import Shortener # Custom form from .forms import ShortenerForm # Create your views here. def home_view(request): template = 'urlshortener/home.html' context = {} # Empty form context['form'] = ShortenerForm() if request.method == 'GET': return render(request, template, context) elif request.method == 'POST': used_form = ShortenerForm(request.POST) if used_form.is_valid(): shortened_object = used_form.save() new_url = request.build_absolute_uri('/') + shortened_object.short_url long_url = shortened_object.long_url context['new_url'] = new_url context['long_url'] = long_url return render(request, template, context) context['errors'] = used_form.errors return render(request, template, context)

このビューは、次の2つの条件に基づいています。

  1. HTTPメソッドがGETと等しい場合:コンテキストとしてのみ渡します。ShortenerフォームはShortenerオブジェクトの作成に使用されます。
  2. HTTPメソッドがPOSTと等しい場合:ユーザーが別のURLを入力できるようにするため、コンテキストでフォームを渡します。 ただし、Postリクエストをused_formという別のフォームに渡します。

完全なサイトURLを動的に取得するトリッキーな方法は、リクエストオブジェクトメソッドbuild_absolute_uriを使用することbuild_absolute_uri

 >>> print(request.build_absolute_uri('/')) 'https://localhost:8080/'

間違ったリクエスト(ユーザーが有効なURLを入力しなかった)を安全に処理する方法として、フォームエラーを取得し、コンテキストとして渡し、テンプレートを通常どおりにレンダリングします。 後で、テンプレートにエラー表示を実装する方法を説明します。

ビューをリダイレクトする

redirect_url_viewは、少し単純です。 これは詳細ビューです。つまり、ビューはオブジェクトでのみ機能します。

この関数は、パラメーターとして、ユーザーの要求とURLのshorted_pa​​rtを取ります。 このビューではフォームを操作していないため、取得しているリクエストのタイプをアサートする必要はありません。

 def redirect_url_view(request, shortened_part): try: shortener = Shortener.objects.get(short_url=shortened_part) shortener.times_followed += 1 shortener.save() return HttpResponseRedirect(shortener.long_url) except: raise Http404('Sorry this link is broken :(')

短縮された部分がデータベースで見つからない場合に備えて、 try / exceptステートメントでビューを保護します。 オブジェクトが見つかった場合、 times_followedフィールドに1を追加し、 HttpResponseRedirect関数を使用してランダムコードに対応するサイトURLにリダイレクトします。

URLの更新

アプリの2つのビューを作成したら、 redirect_url_viewへのパスを含めて最終的なURLパターンを作成します。

いつものように、ビューをインポートしてから、パス関数を作成し、引数として渡すことから始めます。

  • URLルート
  • パスを指すビュー
  • パスの名前
''' Urls for shortener app urlshortener/urls.py ''' from django.urls import path # Import the home view from .views import home_view, redirect_url_view appname = "shortener" urlpatterns = [ # Home view path('', home_view, name='home'), path('<str:shortened_part>', redirect_url_view, name='redirect'), ]

このURL設定では、アプリのルーティングは次のようになります。

  • localhost:8000/ホームビュー
  • localhost:8000/URL-code長いURLへのリダイレクト

テンプレートの作成

もうすぐです。 このアプリを作成したこととあなたを区別する唯一のものは、ユーザーインターフェイスです。 そのために、Djangoテンプレートを使用します。

テンプレートは、アプリユーザーにクリーンなインターフェースを提供するために使用されます。 これらのファイルは、「templates / appname」という形式のダブルフォルダー構造で、アプリ内に作成されます。

 # urlshortener directory mkdir -p templates/urlshortener/

注:ダブルフォルダー構造とDjangoテンプレート言語はこのチュートリアルの範囲を超えていますが、公式ドキュメントでそれらについて読むことができます。

ベーステンプレート

Djangoはテンプレートの継承を許可します。 これは、基本テンプレートを作成し、DRY(Do n't repeat自分自身)の原則に従う目的でそれを拡張できることを意味します。

 cd templates/urlshortener touch base.html

base.htmlファイルは慣例であり、アプリ上の他のすべてのテンプレートがこのテンプレートの拡張子である必要があることを意味します。

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Django Url shortener</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" /> </head> <body> {% block body %} {% endblock body %} <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous" ></script> </body> </html>

ブートストラップCDNを使用して、CSSまたはjavascriptファイルを必要とせずにすばやくきれいなインターフェイスを作成します。

DTLタグについて深く学びたい場合は、公式ドキュメントを使用して行うことができます。

ホームテンプレート

ホームテンプレート、base.htmlファイルからの継承。 つまり、このテンプレートには、親ファイルのすべてのHTMLが含まれています。

 {% extends 'urlshortener/base.html' %} {% block body %} <div class="container"> <div class="card mt-5"> <div class="card-header text-center py-3"> <h1>URL Shortner Application <i class="fas fa-link px-2"></i></h1> </div> <div class="px-3 py-4"> <form action="" method="POST"> {% csrf_token %} <div class="row g-1"> <div class="col-10">{{form.long_url}}</div> <div class="col-2"> <button class="btn btn-success btn-lg w-100" type="submit"> Shorten </button> </div> </div> </form> </div> </div> {% if errors %} <div class="alert alert-danger mt-4" role="alert"> <p>{{errors}}</p> </div> {% endif %} {% if new_url %} <div class="mx-auto text-center mt-5"> <h2 class="text-danger">Your shortened Url</h2> <p>You can copy the Link below and share it with your friends</p> <p class="">{{new_url}}</p> <p><span class="text-danger">Previous URL:</span> {{long_url}}</p> </div> {% endif %} </div> {% endblock body %}

このテンプレートのデータフローについて簡単に説明します。

  • Shortenerフォームが表示されます。 内部では、crsfトークンが設定され(セキュリティ上の理由)、フォームの長いURLフィールドのみが表示されます。 このフィールドにはCSSクラス「form-controlform-control-lg」があることに注意してください。これは、フォームで設定するためです。
  • エラーが見つかった場合は、それらを表示します
  • POST操作が成功すると、新しいURLが表示されます。

最終申請

おめでとう! 。 Djangoを使用して完全に機能するURL短縮アプリを構築しました。

これは、アプリケーションがどのように見えるかのスクリーンショットです。

取得のみ:

URL短縮エラー:

短縮URLの成功:

DjangoURL短縮サービスの成功

リダイレクトされたURL:

成功リダイレクト

このURL短縮アプリのデモを誰かに公開することについてどう思いますか? Djangoデモアプリをインターネットに公開する方法を確認してください。

チャレンジ

Djangoのスキルに慣れている場合は、チャレンジして練習してみませんか?

このアプリケーションのコードを複製し、登録ユーザーのみがURLを短縮できる認証システムを作成します。

完了したら、プルリクエストを送信し、Twitterでpingを送信して、成果を紹介します。

まとめ

このチュートリアルは終了です。 信じられないかもしれませんが、Djangoプロジェクトを作成するためのすべての主要な側面を確認しました。 非常にお役に立てば幸いです。

このチュートリアルでは、次のことを行います。

  • Djangoアプリを作成するワークフローについて学びました。
  • 履歴書プロジェクトを構築
  • DjangoプロジェクトとDjangoアプリの違いと構造を理解しました。
  • MVTパターンを発見しました。
  • 作成された関数ベースビュー
  • Django ORM(Object Relational Mapper)を使用して単純なモデルを作成しました

それだけです。DjangoWebフレームワークでカバーすることがたくさんあるので、もっと素晴らしいチュートリアルのために連絡を取り合ってください。