【Python】Djangoを使ったWebAppに別のAppを追加する
概要
既に作成済みのWebAppに対し、別のAppをアドオンする機会があり、手順をまとめた。
特に気をつけたことは既存のAppに影響が出さないことだったが、どのファイルを編集しなければならないか、を理解することでその不安は無くなった。
前提として、どちらのAppもDjangoを使用して作成している。
手順
新しいアプリケーションの作成
必要なパッケージのインストール
アプリケーションをプロジェクトに追加
スクレイピングのビューを作成: scraper
URLルーティングの追加: scraper
テンプレートの作成:
テストとデバッグ
詳細手順
1.新しいアプリケーションの作成
まずは新しいアプリケーションを作成する。作成とはいうが実際には準備のようなものである。
プロジェクトの最上位ディレクトリにて以下のコードを実行
//テンプレート
$ python manage.py startapp <app名>
<app名>の部分には作りたいアプリの名前(英字)が入る。
今回はスクレイピング機能を追加したかったのでスクレイピングアプリ名scrappと入力した。
//実際に使用したコード
$ python manage.py startapp scrapp
これにより、Webアプリのテンプレート(ファイルやディレクトリ)が自動で作成される。
2.必要なパッケージのインストール
今回は、スクレイピング機能の導入のため、スクレイピングにつかうためのライブラリを導入しておく。よく使われるライブラリとしては、Requests、BeautifulSoup、Seleniumがあるが、今回はBeautifulSoupを使用した。
参考にしたサンプルコードに使われていた、というのが選択した理由である。
手順1同様、プロジェクトの最上位ディレクトリで以下のコマンドを実行し、インストールする。
$ pip install requests beautifulsoup4
3.アプリケーションをプロジェクトに追加
元々のアプリケーションの大元のファイルにこのアプリケーションの存在を認識させる作業をする。
元のAppに影響しないよう特に慎重になる必要がある。
手順としては少なく、setting.pyを開き、「INSTALLED_APPS = 」の枠に新しいApp名を追加するだけである。
INSTALLED_APPS = [
// 元々のApp群...
'<App名>’,
// ...
]
<app名>の部分には作りたいアプリの名前(英字)が入る。
今回のスクレイピングアプリ名scrappの場合は以下になる。
INSTALLED_APPS = [
# 他のアプリケーション...
'scrapp',
# ...
]
この手順により、WebAPP全体として、元々のアプリだけでなく、新しいアプリも読み込む準備が進む。
4.新しいアプリのビューを作成
<app名>/views.pyにコードを記入する。
今回の作成したアプリの場合はscrapp/views.pyになる。
ビューとは言うが、実際にはロジックまで全て記載することが可能。
この項は導入したいアプリによってコードが異なるが、今回は参考までにスクレイピングアプリの場合のサンプルコードを掲載する。
# scrapp/views.py
from django.shortcuts import render
from django.http import HttpResponse
import requests
from bs4 import BeautifulSoup
def scrapp(request):
# スクレイピングしたいURL
url = 'http://yahoo.co.jp' //任意のURLに変更すること
# requestsを使用してウェブページを取得
response = requests.get(url)
# 正常にウェブページが取得できた場合、スクレイピングを実行
if response.status_code == 200:
# 取得したウェブページをBeautifulSoupで解析可能な形式に
soup = BeautifulSoup(response.text, 'html.parser')
# 必要なデータの抽出(この例では全てのh3タグを取得)
h3_tags = soup.find_all('h3')
# データの加工や必要な情報の抽出
extracted_data = []
for tag in h3_tags:
extracted_data.append(tag.text)
# 抽出したデータをテンプレートに渡して表示
context = {'extracted_data': extracted_data}
return render(request, 'scrapp/result.html', context)
# ウェブページの取得ができなかった場合のエラーハンドリング
else:
return HttpResponse('Unable to retrieve webpage.')
※ベースはChatGPTを使用した。このまま使用して動作を保証するものではない
5.URLルーティングの追加(新アプリ側)
新規アプリのurls.pyを新規作成し、コードを入力する。
IDE上で新規アプリディレクトリを右クリック→新規作成の流れ。
新しいAppディレクトリと配下の構造は以下のようになる。
├── <app名>
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── forms.py
│ └── <app名>.py
今回のスクレイピングアプリの場合は以下になった。
├── scrapp
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── forms.py
│ └── (なし) //viewsの中にロジックを入力したため不要になった
# scrapp/urls.py
from django.urls import path
from . import views # ここでscrapp/views.pyからビュー関数をインポート
urlpatterns = [
path('', views.scrapp, name='scrapp'), # scrapeビュー関数と''(アプリケーションのルートURL)を関連付け
]
6.URLルーティングの追加(本体アプリ側)
元々のアプリに影響が出ないよう慎重にならなければならない項目2。
〈メインapp名〉/urls.pyの、「urlpatterns = 」枠に以下のようにURLを追加する。
//プロジェクトのメインurls.pyに新アプリへの接続を記載
urlpatterns = [
# 他のパターン...
path('<app名>/', include('<app名>.urls')), # スクレイピング用URL設定
今回の場合は以下になる。
//プロジェクトのメインurls.pyにscrappアプリへの接続を記載
urlpatterns = [
# 他のパターン...
path('scrapp/', include('scrapp.urls')), # スクレイピング用URL設定
7.テンプレートの作成
アプリの実行結果表示用HTMLを作成する。
①まずはscrappの配下に新規ディレクトリ「templates」を作成
②その配下に新規ディレクトリ「scrapp」を作成
③その配下にresult.htmlを作成し、結果表示用コードを記載
<!-- scraper/templates/scraper/result.html -->
<!DOCTYPE html>
<html lang="ja">
<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>Scraping Results</title>
</head>
<body>
<h1>Scraping Results</h1>
<!-- スクレイピングしたデータをリストで表示 -->
<ul>
{% for data in extracted_data %}
<li>{{ data }}</li>
{% endfor %}
</ul>
</body>
</html>
④「views.py」にアプリ実行結果データをHTMLに渡すコードを記載
今回の場合は以下のコードのようになる。(上記views.pyサンプルコードで既に記載済み)
context = {'extracted_data': extracted_data}
return render(request, 'scrapp/result.html', context)
7.テストとデバッグ
IDEにて開発サーバを起動し実行。仕様書にそってテストをするか、
簡易なものであれば想定通りの動作になっていることを確認できればリリースする。
まとめ
やり方さえわかってしまえば簡単にアプリを追加できるようになる。
気をつけるのはメインアプリのファイルを操作するときだが、今回の場合は2ファイルで済んだ。
この記事が気に入ったらサポートをしてみませんか?