ChatGPTでPythonプログラミング 5 RSSリーダーをDjangoでWEBアプリケーションにする①


ジャンゴ・ラインハルト(Wikipediaより)

一気にハードルを上げてDjangoに挑戦です。DjangoはWEBアプリを開発するためのpythonベースのフレームワークです。Djangoについては以下を参考にしてください。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton, QTextEdit
import feedparser
import urllib.request

class RssReader(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # 入力ウィジェット
        url_label = QLabel('RSSフィードのURL')
        self.url_inputs = []
        for i in range(3):
            url_input = QLineEdit()
            self.url_inputs.append(url_input)

        keyword_label = QLabel('検索キーワード')
        self.keyword_inputs = []
        for i in range(3):
            keyword_input = QLineEdit()
            self.keyword_inputs.append(keyword_input)

        search_button = QPushButton('検索')
        search_button.clicked.connect(self.search)

        input_layout = QVBoxLayout()
        input_layout.addWidget(url_label)
        for url_input in self.url_inputs:
            input_layout.addWidget(url_input)
        input_layout.addWidget(keyword_label)
        for keyword_input in self.keyword_inputs:
            input_layout.addWidget(keyword_input)
        input_layout.addWidget(search_button)

        # 出力ウィジェット
        self.output_label = QLabel('検索結果')
        self.output_text = QTextEdit()

        output_layout = QVBoxLayout()
        output_layout.addWidget(self.output_label)
        output_layout.addWidget(self.output_text)

        # 全体レイアウト
        layout = QVBoxLayout()
        layout.addLayout(input_layout)
        layout.addLayout(output_layout)

        self.setLayout(layout)
        self.setWindowTitle('RSS Reader')
        self.show()

    def search(self):
        # 入力内容を取得
        urls = [url_input.text() for url_input in self.url_inputs if url_input.text()]
        keywords = [keyword_input.text() for keyword_input in self.keyword_inputs if keyword_input.text()]

        if not urls or not keywords:
            self.output_text.setPlainText('URLまたはキーワードを入力してください。')
            return

        # 検索処理
        results = []
        for url in urls:
            feed = feedparser.parse(url, handlers=[urllib.request.HTTPSHandler()])
            for entry in feed.entries:
                for keyword in keywords:
                    if keyword.lower() in entry.title.lower():
                        print(f'Found: {entry.title}, {entry.link}')
                        results.append((entry.title, entry.link))

        # 結果の重複を削除
        results = list(set(results))

        # 出力
        if results:
            self.output_text.setPlainText('\n'.join([f'{title}: {link}' for title, link in results]))
        else:
            self.output_text.setPlainText('該当する記事がありません。')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = RssReader()
    sys.exit(app.exec_())

Djangoのインストール

昨日までにChatGPTをアシスタントにして組み上げた上記RSSリーダープログラムをWEBアプリにしていきます。
以下はChatGPTとのやり取りです。

上記プログラムを基本にしてDjangoでWEBアプリケーションにしていこうと考えていますが、手助けしてもらえますか?

ChatGPTの回答
はい、お手伝いできます。Djangoについての知識や経験があれば、どのようにアプリケーションを構築するかをご説明できます。また、Djangoについて初めての場合は、Djangoの基本的な使い方から始めて、RSSリーダーのアプリケーションを構築する方法をお教えすることができます。どちらかをお知らせください。


Djangoの基本的な使い方から始めて、RSSリーダーのアプリケーションを構築する方法をお教えすることができます。 でお願いします。

ChatGPTの回答
以下にDjangoでのRSSリーダーアプリケーションの作成手順を詳しく説明します。

  1. Djangoのインストール

まずはじめに、Djangoをインストールします。ターミナルやコマンドプロンプトで以下のコマンドを実行してください。

pip install django
  1. Djangoプロジェクトの作成

次に、Djangoプロジェクトを作成します。ターミナルやコマンドプロンプトで以下のコマンドを実行

django-admin startproject myproject

このコマンドで、"myproject"という名前のDjangoプロジェクトが作成されます。

  1. アプリケーションの作成

次に、Djangoアプリケーションを作成します。以下のコマンドを実行してください。

cd myproject
python manage.py startapp myapp

このコマンドで、"myapp"という名前のDjangoアプリケーションが作成されます。

  1. モデルの作成

RSSフィードから取得した記事を保存するためのモデルを作成します。"myapp/models.py"に以下のコードを追加してください。

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    link = models.URLField()

このコードで、"Article"というモデルが作成されます。"title"と"link"という2つのフィールドを持ちます。

  1. ビューの作成

RSSフィードから記事を取得して、データベースに保存する処理を行うビューを作成します。"myapp/views.py"に以下のコードを追加してください。

import feedparser
import urllib.request
from django.shortcuts import render
from .models import Article

def index(request):
    if request.method == 'POST':
        urls = [request.POST.get(f'url{i}', '') for i in range(3)]
        keywords = [request.POST.get(f'keyword{i}', '') for i in range(3)]
        if urls and keywords:
            for url in urls:
                feed = feedparser.parse(url, handlers=[urllib.request.HTTPSHandler()])
                for entry in feed.entries:
                    for keyword in keywords:
                        if keyword.lower() in entry.title.lower():
                            article = Article(title=entry.title, link=entry.link)
                            article.save()

    articles = Article.objects.all().order_by('-id')
    context = {'articles': articles}
    return render(request, 'myapp/index.html', context)

このコードで、"index"という名前のビューが作成されます。POSTメソッドでリクエストが送信された場合、RSSフィードから記事を取得し、データベースに保存します。GETメソッドでリクエストが送信された場合、保存された記事を全て取得し、HTMLファイルに渡します。

次に、以下のようにurls.pyファイルを作成します。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

これは、ルートURLにアクセスした場合にviews.pyファイルのindex関数を呼び出すように設定しています。

最後に、views.pyファイルを作成して、検索結果を返すようにします。

import feedparser
import urllib.request
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    if request.method == 'POST':
        urls = [request.POST.get(f'url{i}') for i in range(3)]
        keywords = [request.POST.get(f'keyword{i}') for i in range(3)]

        if not urls or not keywords:
            return HttpResponse('URLまたはキーワードを入力してください。')

        # 検索処理
        results = []
        for url in urls:
            feed = feedparser.parse(url, handlers=[urllib.request.HTTPSHandler()])
            for entry in feed.entries:
                for keyword in keywords:
                    if keyword.lower() in entry.title.lower():
                        results.append((entry.title, entry.link))

        # 結果の重複を削除
        results = list(set(results))

        # 出力
        if results:
            return render(request, 'rssreader/results.html', {'results': results})
        else:
            return HttpResponse('該当する記事がありません。')

    return render(request, 'rssreader/index.html')

ここでは、POSTリクエストが送信された場合に、入力内容を取得して検索処理を行い、検索結果をテンプレートに渡して表示するようにしています。GETリクエストが送信された場合には、入力フォームを表示するためのテンプレートを表示するようにしています。

以上が、DjangoでRSSリーダーを作成するための基本的な手順です。

さて明日以降実際にやってみます。

いいなと思ったら応援しよう!