TIL

Today I Learned. 知ったこと、学んだことを書いていく

Pythonのメモ一覧

Pythonのメモが多くなってきたため、整理

基礎

標準モジュール

文字列

組み込み関数

ファイル

サードパーティーモジュール

requests

Webフレームワーク

Bottle

Djngo

小技

エラー解決

やってみた

環境・Pythonの知識

DjangoのURLconfについて

DjangoのURLディスパッチャについて調べたときのメモ

Djangoでの あるリクエストに対してどのビューを返すか という仕組みを理解することが目的。

理解できた!!

以下のようなmysite_url_dispというプロジェクトの中にmyappというアプリケーションがあったとする。

$ tree mysite_url_disp/
mysite_url_disp/
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── mysite_url_disp
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

URLディスパッチャ

あるURLに対してどのビュー関数を返すかを設定する。

DjangoのURLディスパッチャはURLconfという設定ファイルに記述することになっている。DjangoではURLconfはurls.pyというファイルに記述する。

リクエストからレスポンスまでの流れ

  1. リクエストが来る
  2. URLディスパッチャがリクエストに対応するview関数を呼び出す
  3. 呼び出されたview関数がレスポンスを返す

URLconf(urls.py, URLディスパッチャの設定ファイル)の役割

URLconfの役割はviews.py内に定義されているview関数とURLのパターンの対応付けを行うこと

views.py内にview関数が記述されていても、URLconfに記述されていないとページは表示されない。

URLconfは2種類ある

mysite_url_disp/urls.pyにすべてのURLconfを書くことはできるが、アプリケーションごとにURLconfを作ると管理がしやすくなる。

URLconfはプロジェクト用とアプリケーション用の2つを作ること!

  • プロジェクト用のURLconf: mysite_url_disp/urls.py
  • アプリケーション用のURLconf: myapp/urls.py

views.pyの役割

view関数を記述し、リクエストに対してのレスポンスを返す

views.py配下のように記述した

from django.shortcuts import render
from django.http.response import HttpResponse


def index_page(request):
    return HttpResponse('This is url test.')

(views.pyについてはここ以外のところで12/3(日)に調べてまとめる)

URLconfにURLディスパッチャを記述する

まずは、アプリケーションのURLconf(myapp/urls.py)にURLディスパッチャを設定する

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index_page, name='index_page'),
]

views.pyの中に定義されているindex_page()関数を index_page という名前で urlpatterns のリストに追加する

次に、プロジェクトのURLconf(mysite_url_disp/urls.py)にURLディスパッチャを設定する

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', include('myapp.urls'), name='myapp'),
]

URLが index/ で始まるとき(http://127.0.0.1:8000/index/http://127.0.0.1:8000/index/hello など)、myappのurlsの中に定義されているurlpatternsを見に行くということになる

アクセスしてみる

python manage.py runserver

http://127.0.0.1:8000/index/ にアクセスしてみると、views.pyのindex_page()に記述した文字列が表示される。

urlpatternsについて

urls.py内にurlpatternsというものがある

これはDjangoによって、URLにマッチする定義があれば、そのview関数を呼び出すという動作をする。ページを追加するときにはurlpatternsにURLパターンを追加する!

urlpatternsについてわかったかも!

それぞれのURLconf内のurlpatternsが以下のようになってたとする

# myapp/urls.py
urlpatterns = [
    url(r'^$', views.index_page, name='index_page'),
    url(r'^hello', views.hello_page, name='hello_page'),
]
# mysite_url_disp/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', include('myapp.urls'), name='myapp'),
]

リクエストのURLによって、動作が変わる


参考文献

親クラスフォームで定義したメソッドを子クラスフォームでオーバーライドし、親側で子側で実装したメソッドを実行する - VB.net

まず、やりたい事は、以下のようなこと

f:id:tmg1998:20171201193324p:plain

キーイベントの処理を親クラスに定義しておき、子クラスでは、親クラスに定義されているメソッドをオーバーライドするだけで、「ボタンクリック時」と「キー押下時」の処理をまとめる。

これが今の自分の最善策だと思う。

ポイント

親クラス側(RootForm)

  • 親クラスのKeyUpイベント発生時のメソッド(RootForm_KeyUp())定義内で、子クラスがオーバーライドしたメソッド(F1Process()F2Process())を呼ぶこと
  • 子クラス側でのKeyUpイベント発生時に子クラスのオブジェクトを取得すること
  • 子クラスにオーバーライドしてもらうメソッドはPublicで定義すること
    • こうしないと、親側から子側でオーバーライドされたメソッドを呼び出すことができない(と思う)

子クラス側(Form1)

  • 親側のメソッド(F1Process()F2Process())をオーバーライドすること
    • こうすることで、親側で定義されたKeyUpイベント発生時に処理を実行できる
  • ボタンクリック時にオーバーライドしたメソッドを呼ぶこと

これで、キー押下時のイベントは意識せずにボタンクリック時の処理を記述することができる!!(?)


From1.vb

Public Class Form1
    Public Overloads Sub F1Process()
        MsgBox("F1!!!!")
    End Sub

    Public Overloads Sub F2Process()
        MsgBox("F2!!!!")
    End Sub

    Private Sub ButtonF1_Click(sender As Object, e As EventArgs) Handles ButtonF1.Click
        ' F1ボタンクリック時にもF1押下時と同じ処理を呼び出す
        F1Process()
    End Sub

    Private Sub ButtonF2_Click(sender As Object, e As EventArgs) Handles ButtonF2.Click
        ' F2ボタンクリック時にもF2押下時と同じ処理を呼び出す
        F2Process()
    End Sub
End Class

RootForm.vb

Public Class RootForm
    
    Private Sub RootForm_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        
        ' 子フォームのFnProcess()を呼ぶため
        Dim form = CTypeDynamic(sender, sender.GetType())

        Select Case e.KeyCode
            Case Keys.F1
                form.F1Process()
            Case Keys.F2
                form.F2Process()
        End Select
    End Sub
    
    ''' <summary>F1キー押下時、F1ボタンクリック時の処理</summary>
    Public Overridable Sub F1Process()
        ' オーバーライドしてください
    End Sub

    Public Overridable Sub F2Process()
        ' オーバーライドしてください
    End Sub
    
End Class

参考文献

Conversion.CTypeDynamic Method (Microsoft.VisualBasic) | Microsoft Docs