{"id":2129,"date":"2023-04-28T13:44:18","date_gmt":"2023-04-28T04:44:18","guid":{"rendered":"https:\/\/edu.ujhb.org\/?p=2129"},"modified":"2023-04-28T13:44:19","modified_gmt":"2023-04-28T04:44:19","slug":"flask%e5%85%a5%e9%96%80%ef%bc%88%e6%97%a5%e6%9c%ac%e8%aa%9e%e7%89%88%ef%bc%89","status":"publish","type":"post","link":"https:\/\/edu.ujhb.org\/?p=2129","title":{"rendered":"Flask\u5165\u9580\uff08\u65e5\u672c\u8a9e\u7248\uff09"},"content":{"rendered":"\n<p>\u30f3\u30c6\u30f3\u30c4\u306b\u5408\u308f\u305b\u3066\u30a2\u30ec\u30f3\u30b8\u3057\u3066\u3082\u3089\u3048\u307e\u3059\u304b\u3002\u307e\u305a\u306f\u30d5\u30e9\u30b9\u30b3\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u304b\u3089\u59cb\u3081\u307e\u3057\u3087\u3046\u3002\u307e\u305a\u3001\u8aac\u660e\u3059\u308b\u5185\u5bb9\u306e\u6982\u8981\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>\u3082\u3061\u308d\u3093\u3002\u4ee5\u4e0b\u306f\u3001Flask \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306b\u57fa\u3065\u304f\u30d3\u30c7\u30aa \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306e\u6982\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30b9\u7d39\u4ecb\u3068Flask\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u7d39\u4ecb\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30b9\u306e\u76ee\u7684\u3068\u5185\u5bb9\u306e\u6982\u8981<\/li>\n\n\n\n<li>Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u7d39\u4ecb<\/li>\n\n\n\n<li>Flask \u3068\u4ed6\u306e Python Web \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u6bd4\u8f03<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u958b\u767a\u74b0\u5883\u306e\u69cb\u6210\u3068\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n<ul class=\"wp-block-list\">\n<li>Python \u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210<\/li>\n\n\n\n<li>Flask \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u4eee\u60f3\u74b0\u5883\uff08virtualenv\uff09\u306e\u5229\u7528<\/li>\n\n\n\n<li>pip \u3092\u4f7f\u7528\u3057\u3066 Python \u4f9d\u5b58\u95a2\u4fc2\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\n<ul class=\"wp-block-list\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u672c\u69cb\u9020<\/li>\n\n\n\n<li>\u7c21\u5358\u306a Hello World \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b<\/li>\n\n\n\n<li>Flask \u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30d5\u30e9\u30b9\u30b3\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u8868\u793a\u6a5f\u80fd\n<ul class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n\n\n\n<li>@app.route \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n\n\n\n<li>\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570<\/li>\n\n\n\n<li>HTTP \u30e1\u30bd\u30c3\u30c9 (GET\u3001POST \u306a\u3069) \u3068\u30d3\u30e5\u30fc\u95a2\u6570<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0 HTTP \u30ec\u30b9\u30dd\u30f3\u30b9<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068 Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n\n\n\n<li>render_template \u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b<\/li>\n\n\n\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3068\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528<\/li>\n\n\n\n<li>Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u69cb\u6587 (\u5909\u6570\u3001\u30d5\u30a3\u30eb\u30bf\u30fc\u3001\u30bf\u30b0\u306a\u3069)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u51e6\u7406\n<ul class=\"wp-block-list\">\n<li>Flask-WTF \u306b\u3088\u308b\u30d5\u30a9\u30fc\u30e0\u306e\u51e6\u7406<\/li>\n\n\n\n<li>CSRF\u4fdd\u8b77<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30d5\u30a1\u30a4\u30eb\u51e6\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Flask-SQLAlchemy \u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n\n\n\n<li>Flask-SQLAlchemy \u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c<\/li>\n\n\n\n<li>Alembic \u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c<\/li>\n\n\n\n<li>\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u9078\u629e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406\n<ul class=\"wp-block-list\">\n<li>Flask-Login \u3067\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3092\u51e6\u7406\u3059\u308b<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u6a29\u5229\u7ba1\u7406\u3092\u4fdd\u8b77\u3059\u308b<\/li>\n\n\n\n<li>Flask-User \u3067\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u3092\u7c21\u7d20\u5316\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>RESTful API \u3068 Flask-RESTful\n<ul class=\"wp-block-list\">\n<li>RESTful API\u57fa\u672c\u6982\u5ff5<\/li>\n\n\n\n<li>Flask-RESTful \u3067 API \u3092\u4f5c\u6210\u3059\u308b<\/li>\n\n\n\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u3068\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3068\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba<\/li>\n\n\n\n<li>API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068 Swagger<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5c55\u958b\u3068\u6700\u9069\u5316\n<ul class=\"wp-block-list\">\n<li>\u5c0e\u5165\u30aa\u30d7\u30b7\u30e7\u30f3 (\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u3001VPS \u306a\u3069)<\/li>\n\n\n\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092 WSGI \u30b5\u30fc\u30d0\u30fc (Gunicorn\u3001uWSGI \u306a\u3069) \u3067\u5b9f\u884c\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Flask \u62e1\u5f35\u6a5f\u80fd\u3068\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af\n<ul class=\"wp-block-list\">\n<li>\u4e00\u822c\u7684\u306a Flask \u62e1\u5f35\u6a5f\u80fd\u306e\u7d39\u4ecb<\/li>\n\n\n\n<li>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u30e2\u30b8\u30e5\u30e9\u30fc \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020<\/li>\n\n\n\n<li>Flask \u306f WebSocket \u3068\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u3067\u901a\u4fe1\u3057\u307e\u3059<\/li>\n\n\n\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c6\u30b9\u30c8\u3068\u81ea\u52d5\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30b3\u30fc\u30b9\u306e\u6982\u8981\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u8df5\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30b9\u306e\u5fa9\u7fd2\u3068\u307e\u3068\u3081<\/li>\n\n\n\n<li>Flask \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b8c\u5168\u306a\u30c7\u30e2\u30f3\u30b9\u30c8\u30ec\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u304a\u3059\u3059\u3081<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u3068\u9ad8\u5ea6\u306a\u30d1\u30b9<\/p>\n\n\n\n<p>\u3053\u308c\u306f\u3001Flask \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306e\u30d3\u30c7\u30aa \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u6982\u8981\u3067\u3059\u3002\u6b21\u306b\u3001\u5404\u7ae0\u306e\u5185\u5bb9\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"13\">\n<li>\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3 API \u306e\u7d71\u5408\u3068 OAuth\n<ul class=\"wp-block-list\">\n<li>\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3 API \u306e\u6982\u5ff5\u3068\u9069\u7528\u30b7\u30ca\u30ea\u30aa<\/li>\n\n\n\n<li>\u30ea\u30af\u30a8\u30b9\u30c8 \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u305f API \u30ea\u30af\u30a8\u30b9\u30c8<\/li>\n\n\n\n<li>OAuth2.0 \u8a8d\u53ef\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n\n\n\n<li>Google\u3001Facebook \u306a\u3069\u306e\u4e00\u822c\u7684\u306a\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3 API \u3092\u7d71\u5408\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u5206\u96e2\u3068 Vue.js\n<ul class=\"wp-block-list\">\n<li>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u5206\u96e2\u306e\u6982\u5ff5\u3068\u5229\u70b9<\/li>\n\n\n\n<li>Vue.js \u306e\u7d39\u4ecb<\/li>\n\n\n\n<li>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u5206\u96e2\u958b\u767a\u306b Vue.js \u3068 Flask \u3092\u4f7f\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u901a\u4fe1\u3068\u30c7\u30fc\u30bf\u306e\u3084\u308a\u53d6\u308a<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Celery \u306b\u3088\u308b\u975e\u540c\u671f\u30bf\u30b9\u30af\u51e6\u7406\n<ul class=\"wp-block-list\">\n<li>\u975e\u540c\u671f\u30bf\u30b9\u30af\u51e6\u7406\u306e\u6982\u5ff5\u3068\u9069\u7528\u30b7\u30ca\u30ea\u30aa<\/li>\n\n\n\n<li>Celery \u3092\u4f7f\u7528\u3057\u3066\u975e\u540c\u671f\u30bf\u30b9\u30af\u3092\u51e6\u7406\u3059\u308b<\/li>\n\n\n\n<li>Flask \u3068 Celery \u306e\u7d71\u5408<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u30bf\u30b9\u30af\u306e\u76e3\u8996\u3068\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u4fdd\u8b77\n<ul class=\"wp-block-list\">\n<li>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4e00\u822c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30ea\u30b9\u30af\u3068\u4fdd\u8b77\u6226\u7565<\/li>\n\n\n\n<li>Flask \u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4fdd\u8b77<\/li>\n\n\n\n<li>Flask-Talisman \u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5f37\u5316<\/li>\n\n\n\n<li>\u5165\u529b\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3068 XSS \u653b\u6483\u4fdd\u8b77<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u56fd\u969b\u5316\u3068\u30ed\u30fc\u30ab\u30ea\u30bc\u30fc\u30b7\u30e7\u30f3\n<ul class=\"wp-block-list\">\n<li>\u56fd\u969b\u5316\u3068\u30ed\u30fc\u30ab\u30ea\u30bc\u30fc\u30b7\u30e7\u30f3\u306e\u6982\u5ff5\u3068\u91cd\u8981\u6027<\/li>\n\n\n\n<li>Flask-Babel \u306b\u3088\u308b\u591a\u8a00\u8a9e\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u30ed\u30fc\u30ab\u30e9\u30a4\u30ba\u3055\u308c\u305f\u6642\u9593\u3068\u901a\u8ca8<\/li>\n\n\n\n<li>\u30a2\u30e9\u30d3\u30a2\u8a9e\u306a\u3069\u306e\u53f3\u304b\u3089\u5de6\u3078\u8a18\u8ff0\u3059\u308b\u8a00\u8a9e\u3092\u51e6\u7406\u3059\u308b\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9 \u30ec\u30a4\u30a2\u30a6\u30c8<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Flask \u3068\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9 \u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u6982\u5ff5\u3068\u5229\u70b9<\/li>\n\n\n\n<li>Flask \u3067\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u3092\u69cb\u7bc9\u3059\u308b<\/li>\n\n\n\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u3068 API \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u9593\u306e\u901a\u4fe1<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d3\u30b9\u306e\u767a\u898b\u3068\u767b\u9332<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Flask \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5206\u6790\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u3068\u30c6\u30af\u30ce\u30ed\u30b8\u306e\u9078\u629e\u3092\u5206\u6790\u3059\u308b<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u3068\u30e2\u30b8\u30e5\u30fc\u30eb\u5206\u5272<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4e3b\u8981\u306a\u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u3068\u5b9f\u88c5\u306e\u8a73\u7d30<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u6700\u9069\u5316\u3068\u53cd\u5fa9<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u7d99\u7d9a\u7684\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3068\u81ea\u52d5\u5c55\u958b\n<ul class=\"wp-block-list\">\n<li>\u7d99\u7d9a\u7684\u306a\u7d71\u5408\u3068\u5c55\u958b\u306e\u6982\u5ff5\u3068\u5229\u70b9<\/li>\n\n\n\n<li>Git \u306b\u3088\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406<\/li>\n\n\n\n<li>Jenkins \u3092\u4f7f\u7528\u3057\u3066\u69cb\u7bc9\u3068\u30c7\u30d7\u30ed\u30a4\u3092\u81ea\u52d5\u5316\u3059\u308b<\/li>\n\n\n\n<li>Docker \u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30b3\u30f3\u30c6\u30ca\u30fc\u5316\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u5b8c\u5168\u306a Flask \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb \u30d3\u30c7\u30aa \u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u6982\u8981\u3067\u3059\u3002\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u3001\u30c1\u30e3\u30d7\u30bf\u30fc\u3092\u9069\u5207\u306b\u8abf\u6574\u307e\u305f\u306f\u8ffd\u52a0\u307e\u305f\u306f\u524a\u9664\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u6982\u8981\u304c\u3001\u8cea\u306e\u9ad8\u3044 IT \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb \u30d3\u30c7\u30aa\u306e\u4f5c\u6210\u306b\u5f79\u7acb\u3064\u3053\u3068\u3092\u9858\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u7d39\u4ecb\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u3053\u306e\u4f1a\u8a71\u3067\u4f7f\u7528\u3055\u308c\u305f\u4ee5\u524d\u306e\u30e2\u30c7\u30eb\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u6700\u65b0\u306e\u30c7\u30d5\u30a9\u30eb\u30c8 \u30e2\u30c7\u30eb\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f<\/p>\n\n\n\n<p>Flask \u306f\u3001\u8efd\u91cf\u306e Python Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002\u305d\u306e\u30b3\u30a2 \u30a2\u30a4\u30c7\u30a2\u306f\u300c\u30de\u30a4\u30af\u30ed\u300d\u3001\u3064\u307e\u308a\u3001\u5c0f\u3055\u304f\u3001\u67d4\u8edf\u3067\u3001\u62e1\u5f35\u3057\u3084\u3059\u3044\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002Django \u306a\u3069\u306e\u5927\u898f\u6a21\u306a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u6bd4\u8f03\u3057\u3066\u3001Flask \u306e\u30b3\u30a2\u306b\u306f\u57fa\u672c\u7684\u306a\u6a5f\u80fd\u3057\u304b\u542b\u307e\u308c\u3066\u304a\u3089\u305a\u3001\u305d\u306e\u4ed6\u306e\u9ad8\u5ea6\u306a\u6a5f\u80fd\u306f\u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u8a2d\u8a08\u306b\u3088\u308a\u3001Flask \u306f\u5c0f\u3055\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3001\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u958b\u767a\u3001API \u958b\u767a\u306a\u3069\u306e\u30b7\u30ca\u30ea\u30aa\u3067\u975e\u5e38\u306b\u4eba\u6c17\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u306f\u3001\u6b21\u306e\u7279\u5fb4\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u7fd2\u5f97\u3057\u3084\u3059\u3044: Flask \u306e\u30b3\u30fc\u30c9\u306f\u975e\u5e38\u306b\u7406\u89e3\u3057\u3084\u3059\u304f\u3001\u66f8\u304d\u3084\u3059\u304f\u3001\u5b66\u7fd2\u30b3\u30b9\u30c8\u3082\u4f4e\u304f\u6291\u3048\u3089\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u62e1\u5f35\u304c\u7c21\u5358: Flask \u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30e6\u30fc\u30b6\u30fc\u306f\u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3088\u308a\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u62e1\u5f35\u6a5f\u80fd\u3068 Flask \u306e\u7d71\u5408\u306f\u975e\u5e38\u306b\u7c21\u5358\u3067\u3059\u3002<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u62e1\u5f35\u6a5f\u80fd: Flask \u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u306f\u975e\u5e38\u306b\u6d3b\u767a\u3067\u3001Flask-WTF\u3001Flask-Login\u3001Flask-RESTful \u306a\u3069\u306e\u9ad8\u54c1\u8cea\u306e\u62e1\u5f35\u6a5f\u80fd\u304c\u591a\u6570\u3042\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u8efd\u91cf: Flask \u30b3\u30a2\u306b\u306f\u57fa\u672c\u7684\u306a\u6a5f\u80fd\u306e\u307f\u304c\u542b\u307e\u308c\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u30b5\u30a4\u30ba\u304c\u5c0f\u3055\u304f\u3001\u9ad8\u901f\u306b\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u67d4\u8edf\u6027: Flask \u306b\u306f\u56fa\u5b9a\u3055\u308c\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u304c\u306a\u304f\u3001\u7279\u5b9a\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u30b3\u30fc\u30c9\u3092\u81ea\u7531\u306b\u7de8\u6210\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>Flask-Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3: Flask \u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066 HTML \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u307e\u3059\u3002\u975e\u5e38\u306b\u5f37\u529b\u3067\u4f7f\u3044\u3084\u3059\u3044\u3067\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u3064\u307e\u308a\u3001Flask \u306f\u975e\u5e38\u306b\u67d4\u8edf\u3067\u62e1\u5f35\u304c\u5bb9\u6613\u306a\u8efd\u91cf\u306e Python Web \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3042\u308a\u3001\u5c0f\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3001\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u958b\u767a\u3001API \u958b\u767a\u306a\u3069\u306e\u30b7\u30ca\u30ea\u30aa\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3059\u3070\u3084\u304f\u69cb\u7bc9\u3057\u305f\u3044\u5834\u5408\u306f\u3001Flask \u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u3068\u4ed6\u306e Python Web \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u306e\u6bd4\u8f03\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u306f Python Web \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u30e1\u30f3\u30d0\u30fc\u3067\u3059. \u4ed6\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af (Django, Tornado, Pyramid \u306a\u3069) \u3068\u6bd4\u8f03\u3059\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306a\u9055\u3044\u304c\u3042\u308a\u307e\u3059:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a2d\u8a08\u30b3\u30f3\u30bb\u30d7\u30c8: Flask \u306e\u30b3\u30a2 \u30a2\u30a4\u30c7\u30a2\u306f\u300c\u30de\u30a4\u30af\u30ed\u300d\u3001\u3064\u307e\u308a\u3001\u5c0f\u3055\u304f\u3001\u67d4\u8edf\u3067\u3001\u62e1\u5f35\u3057\u3084\u3059\u3044\u3053\u3068\u3067\u3059\u304c\u3001Django \u306a\u3069\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u3001\u591a\u6570\u306e\u6a5f\u80fd\u3092\u542b\u3080\u3001\u3042\u3089\u3086\u308b Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u306e\u63d0\u4f9b\u306b\u53d6\u308a\u7d44\u3093\u3067\u3044\u307e\u3059\u3002\u304a\u3088\u3073\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306a\u306e\u3067\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u81ea\u4f53\u306f\u6bd4\u8f03\u7684\u5927\u304d\u304f\u306a\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020: Flask \u306b\u306f\u56fa\u5b9a\u3055\u308c\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u304c\u306a\u304f\u3001\u7279\u5b9a\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u30b3\u30fc\u30c9\u3092\u81ea\u7531\u306b\u7de8\u6210\u3067\u304d\u307e\u3059\u304c\u3001Django \u306a\u3069\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u306f\u3001\u3088\u308a\u9069\u5207\u306a\u7ba1\u7406\u3068\u958b\u767a\u306e\u305f\u3081\u306b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u304c\u56fa\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9: Flask \u306f\u3055\u307e\u3056\u307e\u306a\u7a2e\u985e\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 (MySQL\u3001PostgreSQL\u3001SQLite \u306a\u3069) \u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u304c\u3001ORM \u3092\u63d0\u4f9b\u3057\u307e\u305b\u3093\u3002\u4e00\u65b9\u3001Django \u306f\u5f37\u529b\u306a ORM \u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u95a2\u6570\u62e1\u5f35: Flask \u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u306f\u62e1\u5f35\u6a5f\u80fd\u3092\u4ecb\u3057\u3066\u3088\u308a\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u3001\u62e1\u5f35\u6a5f\u80fd\u3068 Flask \u306e\u7d71\u5408\u306f\u975e\u5e38\u306b\u7c21\u5358\u3067\u3059\u304c\u3001Django \u306f\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u81ea\u4f53\u3067\u591a\u304f\u306e\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9: Django \u306a\u3069\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u6bd4\u8f03\u3059\u308b\u3068\u3001Flask \u306f\u30b5\u30a4\u30ba\u304c\u5c0f\u3055\u304f\u6a5f\u80fd\u304c\u5c11\u306a\u3044\u305f\u3081\u3001\u3088\u308a\u9ad8\u901f\u306b\u5b9f\u884c\u3055\u308c\u307e\u3059\u304c\u3001Flask \u306b\u306f\u3088\u308a\u591a\u304f\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3068\u62e1\u5f35\u4f5c\u696d\u304c\u5fc5\u8981\u3067\u3042\u308b\u3053\u3068\u3082\u610f\u5473\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u3055\u307e\u3056\u307e\u306a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u304c\u3055\u307e\u3056\u307e\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002\u5c0f\u3055\u306a Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u307e\u305f\u306f API \u30b5\u30fc\u30d3\u30b9\u3092\u3059\u3070\u3084\u304f\u69cb\u7bc9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001Flask \u304c\u975e\u5e38\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001\u5927\u898f\u6a21\u3067\u8907\u96d1\u306a Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u69cb\u7bc9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001Django \u306a\u3069\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u65b9\u304c\u9069\u3057\u3066\u3044\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Python\u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Python \u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3092\u958b\u59cb\u3059\u308b\u524d\u306b\u3001Python \u30e9\u30f3\u30bf\u30a4\u30e0\u74b0\u5883\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001Python \u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Python \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b: Python \u516c\u5f0f Web \u30b5\u30a4\u30c8 ( https:\/\/www.python.org\/downloads\/)<a href=\"https:\/\/www.python.org\/downloads\/%EF%BC%89%E4%B8%8A%E4%B8%8B%E8%BD%BD%E7%9B%B8%E5%BA%94%E7%89%88%E6%9C%AC%E7%9A%84Python%E5%AE%89%E8%A3%85%E5%8C%85%E3%80%82%E5%BB%BA%E8%AE%AE%E9%80%89%E6%8B%A9%E6%9C%80%E6%96%B0%E7%A8%B3%E5%AE%9A%E7%89%88%EF%BC%88%E9%80%9A%E5%B8%B8%E4%BB%A5x.y.z%E5%BD%A2%E5%BC%8F%E5%91%BD%E5%90%8D%EF%BC%8Cx%E3%80%81y%E3%80%81z%E4%B8%BA%E6%95%B0%E5%AD%97%EF%BC%89%E3%80%82\">\u304b\u3089\u3001\u5bfe\u5fdc\u3059\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Python \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002\u6700\u65b0\u306e\u5b89\u5b9a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059 (\u901a\u5e38\u3001x\u3001y\u3001\u304a\u3088\u3073 z \u306f\u6570\u5b57\u3067\u3042\u308b xyz \u306e\u5f62\u5f0f\u3067\u540d\u524d\u304c\u4ed8\u3051\u3089\u308c\u307e\u3059)\u3002<\/a><\/li>\n\n\n\n<li>Python \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3057\u3001\u30d7\u30ed\u30f3\u30d7\u30c8\u306b\u5f93\u3063\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u76f4\u63a5 Python \u3092\u4f7f\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e2d\u306b [Add Python to PATH] \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30f3\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/li>\n\n\n\n<li>Python \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u78ba\u8a8d\u3059\u308b: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u306b\u300cpython\u300d\u3068\u5165\u529b\u3057\u307e\u3059. Python \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831\u304c\u8868\u793a\u3055\u308c\u305f\u5834\u5408\u306f\u3001Python \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u6210\u529f\u3057\u305f\u3053\u3068\u3092\u610f\u5473\u3057\u307e\u3059.<\/li>\n\n\n\n<li>pip \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: pip \u306f Python \u7528\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u7ba1\u7406\u30c4\u30fc\u30eb\u3067\u3001Python \u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3001\u304a\u3088\u3073\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u300cpython -m ensurepip \u2013default-pip\u300d\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001pip \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>pip \u306e\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9: pip \u306f\u5e38\u306b\u66f4\u65b0\u3055\u308c\u308b\u305f\u3081\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 pip \u3092\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059: python -m pip install \u2013upgrade pip<\/li>\n\n\n\n<li>Python \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b: pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u5fc5\u8981\u306a Python \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u300cpip install Flask\u300d\u3067 Flask \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u300cpip freeze\u300d\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Python \u30d1\u30c3\u30b1\u30fc\u30b8\u3068\u305d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>Python \u74b0\u5883\u5909\u6570\u306e\u69cb\u6210: Windows \u30b7\u30b9\u30c6\u30e0\u3067\u306f\u3001Python \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u30d1\u30b9\u3092\u74b0\u5883\u5909\u6570\u306b\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5177\u4f53\u7684\u306a\u64cd\u4f5c\u306f\u3001\u300c\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb \u30d1\u30cd\u30eb\u300d\u306e\u300c\u30b7\u30b9\u30c6\u30e0\u300d-\u300c\u30b7\u30b9\u30c6\u30e0\u306e\u8a73\u7d30\u8a2d\u5b9a\u300d-\u300c\u74b0\u5883\u5909\u6570\u300d\u3092\u958b\u304d\u3001\u30b7\u30b9\u30c6\u30e0\u5909\u6570\u3067\u300c\u30d1\u30b9\u300d\u5909\u6570\u3092\u200b\u200b\u898b\u3064\u3051\u3001Python \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u30d1\u30b9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u4e0a\u8a18\u306e\u624b\u9806\u3067\u3001Python \u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210\u3092\u5b8c\u4e86\u3067\u304d\u307e\u3059\u3002Linux \u307e\u305f\u306f Mac \u30b7\u30b9\u30c6\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\u306f\u4f3c\u3066\u3044\u307e\u3059\u304c\u3001\u8a73\u7d30\u304c\u7570\u306a\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002\u3055\u3089\u306b\u3001\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u4e2d\u306b\u4eee\u60f3\u74b0\u5883\u3092\u4f7f\u7528\u3057\u3066\u3001\u7570\u306a\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e Python \u74b0\u5883\u3068\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5206\u96e2\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002\u4eee\u60f3\u74b0\u5883\u306f\u3001virtualenv \u3084 conda \u306a\u3069\u306e\u4eee\u60f3\u74b0\u5883\u7ba1\u7406\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u306f Python \u30a6\u30a7\u30d6 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u4f7f\u7528\u3059\u308b\u524d\u306b\u3001\u307e\u305a Python \u74b0\u5883\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002Python \u74b0\u5883\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u3089\u3001pip \u30d1\u30c3\u30b1\u30fc\u30b8\u7ba1\u7406\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066 Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30e9\u30b9\u30b3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306b\u306f\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3068\u304d\u306b\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002<a href=\"https:\/\/pypi.org\/project\/Flask\/%EF%BC%89%E6%88%96%E8%80%85Flask%E7%9A%84GitHub%E9%A1%B5%E9%9D%A2%EF%BC%88https:\/\/github.com\/pallets\/flask%EF%BC%89%E4%B8%AD%E6%9F%A5%E7%9C%8B%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E5%8F%B7%E3%80%82\">\u6700\u65b0\u306e\u5b89\u5b9a\u7248\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059.\u6700\u65b0\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7\u306f\u3001<\/a>&nbsp;Flask \u516c\u5f0f Web \u30b5\u30a4\u30c8 ( https:\/\/pypi.org\/project\/Flask\/) \u307e\u305f\u306f Flask \u306e GitHub \u30da\u30fc\u30b8 (https:\/\/github.com\/pallets\/) \u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002\u30d5\u30e9\u30b9\u30b3\uff09\u3002<a href=\"https:\/\/pypi.org\/project\/Flask\/%EF%BC%89%E6%88%96%E8%80%85Flask%E7%9A%84GitHub%E9%A1%B5%E9%9D%A2%EF%BC%88https:\/\/github.com\/pallets\/flask%EF%BC%89%E4%B8%AD%E6%9F%A5%E7%9C%8B%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E5%8F%B7%E3%80%82\"><\/a><\/p>\n\n\n\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3067\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask==x.y.z\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3046\u3061\u3001xyz \u306f Flask \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7\u3092\u8868\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u3001\u4e00\u90e8\u306e\u62e1\u5f35\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u306f\u3001\u9069\u5207\u306b\u52d5\u4f5c\u3059\u308b\u305f\u3081\u306b\u7279\u5b9a\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Flask \u304c\u5fc5\u8981\u306b\u306a\u308b\u5834\u5408\u304c\u3042\u308b\u305f\u3081\u3001Flask \u62e1\u5f35\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u969b\u306b\u306f\u3001\u62e1\u5f35\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u8981\u4ef6\u306b\u5f93\u3063\u3066\u3001\u5bfe\u5fdc\u3059\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Flask \u3068\u305d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3067\u4e00\u89a7\u8868\u793a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">perl\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip freeze | grep Flask\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001Flask \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e\u306b\u95a2\u3059\u308b\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u524d\u306b Python \u74b0\u5883\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4eee\u60f3\u74b0\u5883\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u4eee\u60f3\u74b0\u5883\uff08virtualenv\uff09\u306e\u4f7f\u3044\u65b9\u3092\u8a73\u3057\u304f\u6559\u3048\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u4eee\u60f3\u74b0\u5883 (virtualenv) \u306f\u3001Python \u3067\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b\u4f9d\u5b58\u95a2\u4fc2\u5206\u96e2\u30e1\u30ab\u30cb\u30ba\u30e0\u3067\u3042\u308a\u3001\u7570\u306a\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u5206\u96e2\u3057\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u7af6\u5408\u3092\u56de\u907f\u3067\u304d\u307e\u3059\u3002Python \u3067\u306f\u3001virtualenv \u3092\u4f7f\u7528\u3057\u3066\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001\u4eee\u60f3\u74b0\u5883\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>virtualenv \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001virtualenv \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install virtualenv\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u5165\u529b\u3057\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>virtualenv env\n<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u4e2d\u3067\u3001env \u306f\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u4eee\u60f3\u74b0\u5883\u306e\u540d\u524d\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u5316: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u5316\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>.\\env\\Scripts\\activate\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>source env\/bin\/activate\n<\/code><\/pre>\n\n\n\n<p>\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u5316\u3059\u308b\u3068\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3 \u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u4eee\u60f3\u74b0\u5883\u306e\u540d\u524d\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306b\u5909\u308f\u308a\u3001\u4eee\u60f3\u74b0\u5883\u306b\u5165\u3063\u305f\u3053\u3068\u304c\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b: pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u5fc5\u8981\u306a Python \u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4eee\u60f3\u74b0\u5883\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u3001\u73fe\u5728\u306e\u4eee\u60f3\u74b0\u5883\u306b\u306e\u307f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3001\u30b7\u30b9\u30c6\u30e0\u306e Python \u74b0\u5883\u3084\u305d\u306e\u4ed6\u306e\u4eee\u60f3\u74b0\u5883\u306b\u306f\u5f71\u97ff\u3057\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u4eee\u60f3\u74b0\u5883\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001\u4eee\u60f3\u74b0\u5883\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>deactivate\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u4eee\u60f3\u74b0\u5883\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002\u4eee\u60f3\u74b0\u5883\u306f Python \u306e\u975e\u5e38\u306b\u5b9f\u7528\u7684\u306a\u6a5f\u80fd\u3067\u3042\u308a\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u7af6\u5408\u3092\u56de\u907f\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059.\u4eee\u60f3\u74b0\u5883\u3092\u4f7f\u7528\u3057\u3066\u3001\u958b\u767a\u4e2d\u306b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>pip \u3092\u4f7f\u7528\u3057\u3066 Python \u4f9d\u5b58\u95a2\u4fc2\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3059\u308b\u65b9\u6cd5\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>pip \u306f\u3001Python \u3067\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u7ba1\u7406\u30c4\u30fc\u30eb\u3067\u3042\u308a\u3001Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3001\u304a\u3088\u3073\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002pip \u3092\u4f7f\u7528\u3059\u308b\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b: pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u5fc5\u8981\u306a Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u3001\u30b7\u30b9\u30c6\u30e0\u306e Python \u74b0\u5883\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4e00\u89a7\u8868\u793a\u3059\u308b: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Python \u306e\u4f9d\u5b58\u95a2\u4fc2\u3068\u305d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip freeze\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3067\u304d\u308b\u30c6\u30ad\u30b9\u30c8 \u30ea\u30b9\u30c8\u3092\u51fa\u529b\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip freeze &gt; requirements.txt\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3057\u3066\u3001\u73fe\u5728\u306e\u74b0\u5883\u306e Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30ea\u30b9\u30c8\u3092 requirements.txt \u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u4ed6\u306e\u30de\u30b7\u30f3\u306b\u540c\u3058\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5834\u5408\u306b\u4fbf\u5229\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u6307\u5b9a\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b: pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6307\u5b9a\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3\u306e Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask==0.12.2\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3046\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f Flask \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7\u306f 0.12.2 \u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">css\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install --upgrade Flask\n<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Flask \u4f9d\u5b58\u95a2\u4fc2\u304c\u6700\u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 pip \u3092\u4f7f\u7528\u3057\u3066\u3001\u4e0d\u8981\u306b\u306a\u3063\u305f Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip uninstall Flask\n<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b Flask \u4f9d\u5b58\u95a2\u4fc2\u304c\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea \u30ea\u30b9\u30c8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 pip \u3092\u4f7f\u7528\u3057\u3066\u3001requirements.txt \u30d5\u30a1\u30a4\u30eb\u306b\u30ea\u30b9\u30c8\u3055\u308c\u3066\u3044\u308b Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install -r requirements.txt\n<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001requirements.txt \u30d5\u30a1\u30a4\u30eb\u306b\u30ea\u30b9\u30c8\u3055\u308c\u3066\u3044\u308b\u3059\u3079\u3066\u306e Python \u4f9d\u5b58\u95a2\u4fc2\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u73fe\u5728\u306e\u74b0\u5883\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001pip \u3092\u4f7f\u7528\u3057\u3066 Python \u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002pip \u306f Python \u306e\u975e\u5e38\u306b\u5b9f\u7528\u7684\u306a\u30c4\u30fc\u30eb\u3067\u3042\u308a\u3001Python \u306b\u4f9d\u5b58\u3059\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u7ba1\u7406\u3092\u5927\u5e45\u306b\u5bb9\u6613\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7c21\u5358\u306aFlask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u69cb\u9020\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/p>\n\n\n\n<p>\u30b7\u30f3\u30d7\u30eb\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u69cb\u9020\u306f\u3001\u6b21\u306e\u624b\u9806\u3067\u69cb\u6210\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u306e\u4f5c\u6210: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>mkdir myproject\ncd myproject\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 virtualenv \u3092\u4f7f\u7528\u3057\u3066\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>virtualenv env\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3059\u308b: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>.\\env\\Scripts\\activate\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>source env\/bin\/activate\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Flask \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 pip \u3092\u4f7f\u7528\u3057\u3066 Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u306b app.py \u3068\u3044\u3046\u540d\u524d\u306e Python \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u306f\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u305f\u3068\u304d\u306b\u5358\u7d14\u306a\u6587\u5b57\u5217\u3092\u8fd4\u3059 app \u3068\u3044\u3046\u540d\u524d\u306e Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>set FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>export FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u3067 http:\/\/127.0.0.1:5000\/ \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001&nbsp;\u300cHello, World!\u300d\u306e\u6587\u5b57\u5217\u3092<a href=\"http:\/\/127.0.0.1:5000\/%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%22Hello\">\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/a><\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u5358\u7d14\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u69cb\u9020\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u672c\u69cb\u9020\u306b\u306f\u3001\u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210\u3068\u30a2\u30af\u30c6\u30a3\u30d6\u5316\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u304c\u542b\u307e\u308c\u307e\u3059\u3002\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u7279\u5b9a\u306e\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u30b3\u30fc\u30c9\u3092\u8a18\u8ff0\u304a\u3088\u3073\u7de8\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 \u7c21\u5358\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b \u7c21\u5358\u306a Hello World \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b<\/p>\n\n\n\n<p>\u30b7\u30f3\u30d7\u30eb\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b Hello World \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u6b21\u306e\u624b\u9806\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u306e\u4f5c\u6210: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>mkdir myproject\ncd myproject\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 virtualenv \u3092\u4f7f\u7528\u3057\u3066\u4eee\u60f3\u74b0\u5883\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>virtualenv env\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3059\u308b: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u4eee\u60f3\u74b0\u5883\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>.\\env\\Scripts\\activate\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>source env\/bin\/activate\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Flask \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb: \u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067 pip \u3092\u4f7f\u7528\u3057\u3066 Flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u306b app.py \u3068\u3044\u3046\u540d\u524d\u306e Python \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u306f\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u305f\u3068\u304d\u306b\u5358\u7d14\u306a &#8220;Hello, World!&#8221; \u6587\u5b57\u5217\u3092\u8fd4\u3059 app \u3068\u3044\u3046\u540d\u524d\u306e Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>set FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>export FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\">\n<li>\u30c6\u30b9\u30c8 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3: \u30d6\u30e9\u30a6\u30b6\u30fc\u3067 http:\/\/127.0.0.1:5000\/ \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001&nbsp;&#8220;Hello, World!&#8221; \u306e\u6587\u5b57\u5217<a href=\"http:\/\/127.0.0.1:5000\/%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%22Hello\">\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/a><\/li>\n<\/ol>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u5358\u7d14\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 Hello World \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u7279\u5b9a\u306e\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u30b3\u30fc\u30c9\u3092\u8a18\u8ff0\u304a\u3088\u3073\u7de8\u6210\u3067\u304d\u307e\u3059.Flask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u672c\u69cb\u9020\u306b\u306f\u3001\u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210\u3068\u30a2\u30af\u30c6\u30a3\u30d6\u5316\u3001Flask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u8a18\u8ff0\u3001\u304a\u3088\u3073Flask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u64cd\u4f5c\u304c\u542b\u307e\u308c\u307e\u3059.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u7c21\u5358\u306aFlask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001flask run \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u304b\u3001app.run() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u306b app.py \u3068\u3044\u3046\u540d\u524d\u306e Python \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u306f\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u305f\u3068\u304d\u306b\u5358\u7d14\u306a &#8220;Hello, World!&#8221; \u6587\u5b57\u5217\u3092\u8fd4\u3059 app \u3068\u3044\u3046\u540d\u524d\u306e Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30e9\u30b9\u30b3\u5b9f\u884c\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>set FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>export FLASK_APP=app.py\nflask run\n<\/code><\/pre>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u3067 http:\/\/127.0.0.1:5000\/ \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001&nbsp;\u300cHello, World!\u300d\u306e\u6587\u5b57\u5217\u3092<a href=\"http:\/\/127.0.0.1:5000\/%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%22Hello\">\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/a><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>app.run() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3092 app.py \u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>if __name__ == '__main__':\n    app.run()\n<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u306b\u3088\u308a\u3001Python \u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066 app.py \u30d5\u30a1\u30a4\u30eb\u3092\u76f4\u63a5\u5b9f\u884c\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u3059\u3002\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u5165\u529b\u3057\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u3066\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>python app.py\n<\/code><\/pre>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u3067 http:\/\/127.0.0.1:5000\/ \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001&nbsp;\u300cHello, World!\u300d\u306e\u6587\u5b57\u5217\u3092<a href=\"http:\/\/127.0.0.1:5000\/%E5%8D%B3%E5%8F%AF%E7%9C%8B%E5%88%B0%22Hello\">\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/a><\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001Flask \u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002\u30d5\u30e9\u30b9\u30b3\u306e run \u30b3\u30de\u30f3\u30c9\u307e\u305f\u306f app.run() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3059\u308b\u3053\u3068\u3092\u9078\u629e\u3057\u3001\u7279\u5b9a\u306e\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u65b9\u6cd5\u3092\u9078\u629e\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7c21\u5358\u306aFlask\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883\u3092\u4f5c\u308b\u305f\u3081\u306b\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u3067\u306f\u3001\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3092\u5bb9\u6613\u306b\u3059\u308b\u305f\u3081\u306b\u3001Flask \u306e\u30c7\u30d0\u30c3\u30b0 \u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9<\/li>\n<\/ol>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0 \u30e2\u30fc\u30c9\u3067\u306f\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u4f8b\u5916\u304c\u767a\u751f\u3059\u308b\u3068\u3001Flask \u306f\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u30c7\u30d0\u30c3\u30b0\u306b\u4fbf\u5229\u3067\u3059\u3002\u6b21\u306e\u65b9\u6cd5\u3067\u30c7\u30d0\u30c3\u30b0 \u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b21\u306e\u30b3\u30fc\u30c9\u3092 app.py \u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>app = Flask(__name__)\n\napp.config['DEBUG'] = True\n<\/code><\/pre>\n\n\n\n<p>\u307e\u305f\u306f\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30d0\u30c3\u30b0 \u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>set FLASK_APP=app.py\nset FLASK_ENV=development\nflask run\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>export FLASK_APP=app.py\nexport FLASK_ENV=development\nflask run\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u8d77\u52d5\u3057\u305fFlask\u30a2\u30d7\u30ea\u306f\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u52d5\u4f5c\u3057\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u4f8b\u5916\u304c\u767a\u751f\u3059\u308b\u3068\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u958b\u767a\u74b0\u5883<\/li>\n<\/ol>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u3067\u306f\u3001\u3088\u308a\u4fbf\u5229\u306a\u65b9\u6cd5\u3067\u30c7\u30d0\u30c3\u30b0\u3068\u958b\u767a\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002Flask \u306f\u3001\u81ea\u52d5\u30ea\u30ed\u30fc\u30c9\u3001\u30c7\u30d0\u30c3\u30b0 \u30c4\u30fc\u30eb\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3 \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306a\u3069\u3001\u958b\u767a\u74b0\u5883\u3067\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u591a\u304f\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u958b\u767a\u74b0\u5883\u306f\u4ee5\u4e0b\u3067\u958b\u59cb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b21\u306e\u30b3\u30fc\u30c9\u3092 app.py \u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>app = Flask(__name__)\n\napp.config['ENV'] = 'development'\n<\/code><\/pre>\n\n\n\n<p>\u307e\u305f\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u3067\u958b\u767a\u74b0\u5883\u3092\u958b\u59cb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30ba\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>set FLASK_APP=app.py\nset FLASK_ENV=development\nflask run\n<\/code><\/pre>\n\n\n\n<p>Linux\/Mac\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>export FLASK_APP=app.py\nexport FLASK_ENV=development\nflask run\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u8d77\u52d5\u3055\u308c\u305f Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\u958b\u767a\u74b0\u5883\u3067\u5b9f\u884c\u3055\u308c\u3001\u3088\u308a\u4fbf\u5229\u306a\u65b9\u6cd5\u3067\u30c7\u30d0\u30c3\u30b0\u304a\u3088\u3073\u958b\u767a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u5358\u7d14\u306a Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d0\u30c3\u30b0 \u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883\u306e\u4f5c\u6210\u306b\u95a2\u3059\u308b\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u4e2d\u3001\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u958b\u767a\u52b9\u7387\u3068\u30c7\u30d0\u30c3\u30b0\u52b9\u679c\u304c\u5927\u5e45\u306b\u5411\u4e0a\u3057\u307e\u3059\u3002\u672c\u756a\u74b0\u5883\u3067\u306f\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3068\u958b\u767a\u74b0\u5883\u3092\u30aa\u30d5\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u57fa\u672c\u6982\u5ff5\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u306f\u3001URL \u3092\u5bfe\u5fdc\u3059\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u95a2\u9023\u4ed8\u3051\u308b\u30d7\u30ed\u30bb\u30b9\u3092\u6307\u3057\u307e\u3059\u3002\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3057\u3066\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059\u95a2\u6570\u3067\u3059\u3002<\/p>\n\n\n\n<p>Flask \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u5bc6\u63a5\u306b\u95a2\u9023\u3057\u3066\u3044\u307e\u3059. \u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f\u3001\u8981\u6c42\u3055\u308c\u305f URL \u3092\u5bfe\u5fdc\u3059\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u30de\u30c3\u30d7\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u8981\u6c42\u3092\u51e6\u7406\u3057\u3066\u5fdc\u7b54\u3092\u8fd4\u3057\u307e\u3059.&nbsp;Flask \u3067\u306f\u3001\u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3057\u3001\u95a2\u6570\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304a\u3088\u3073\u30d3\u30e5\u30fc\u6a5f\u80fd\u306e\u57fa\u672c\u6982\u5ff5\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<p>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f\u3001\u8981\u6c42\u3055\u308c\u305f URL \u3092\u5bfe\u5fdc\u3059\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u95a2\u9023\u4ed8\u3051\u308b\u30d7\u30ed\u30bb\u30b9\u3067\u3059\u3002Flask \u3067\u306f\u3001 @app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u3092 hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u306b\u95a2\u9023\u4ed8\u3051\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello_world():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217 &#8216;Hello, World!&#8217; \u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d3\u30e5\u30fc\u6a5f\u80fd<\/li>\n<\/ol>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u3001\u8981\u6c42\u3092\u51e6\u7406\u3057\u3066\u5fdc\u7b54\u3092\u8fd4\u3059\u95a2\u6570\u3067\u3059\u3002Flask \u3067\u306f\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u6b21\u306e\u6761\u4ef6\u3092\u6e80\u305f\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fdc\u7b54 (\u6587\u5b57\u5217\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3001\u30d5\u30a1\u30a4\u30eb\u306a\u3069) \u3092\u8fd4\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>GET\u3084POST\u306a\u3069\u306eHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u30e1\u30bd\u30c3\u30c9\u3092\u53d7\u3051\u4ed8\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3059\u308b\u305f\u3081\u306b\u30c7\u30b3\u30ec\u30fc\u30bf\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001hello_world() \u3068\u3044\u3046\u540d\u524d\u306e\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello_world():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217 &#8216;Hello, World!&#8217; \u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0a\u304cFlask\u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u6a5f\u80fd\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306e\u57fa\u672c\u7684\u306a\u8003\u3048\u65b9\u3067\u3059\u3002Flask \u3067\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u5bc6\u63a5\u306b\u95a2\u9023\u3057\u3066\u3044\u307e\u3059\u3002\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f\u3001\u8981\u6c42\u3055\u308c\u305f URL \u3092\u5bfe\u5fdc\u3059\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u30de\u30c3\u30d7\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u8981\u6c42\u3092\u51e6\u7406\u3057\u3066\u5fdc\u7b54\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 @app.route \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3057\u307e\u3059<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30c7\u30b3\u30ec\u30fc\u30bf @app.route() \u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3057\u3001\u95a2\u6570\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002@app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u306f\u3001URL \u30eb\u30fc\u30eb\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3068\u3057\u3066\u6e21\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u8981\u6c42\u3055\u308c\u305f URL \u3092\u5bfe\u5fdc\u3059\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u30de\u30c3\u30d7\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002@app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3057\u3001\u95a2\u6570\u3092\u8868\u793a\u3059\u308b\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>app = Flask(__name__)\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>@app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3057\u3001\u95a2\u6570\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u3092 hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u306b\u95a2\u9023\u4ed8\u3051\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/')\ndef hello_world():\n    return 'Hello, World!'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217 &#8216;Hello, World!&#8217; \u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>@app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u8907\u6570\u306e\u30eb\u30fc\u30c8\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f 2 \u3064\u306e\u30eb\u30fc\u30c8\u95a2\u6570\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/')\ndef hello_world():\n    return 'Hello, World!'\n\n@app.route('\/about')\ndef about():\n    return 'About us'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9\u300c\/\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_world() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217\u300cHello, World!\u300d\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002\u30d1\u30b9\u300c\/about\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001about() view \u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001&#8217;About us&#8217; \u6587\u5b57\u5217\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f\u3001URL \u30eb\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001\u52d5\u7684\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u540d\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/hello\/&lt;name&gt;')\ndef hello_name(name):\n    return 'Hello, %s!' % name\n<\/code><\/pre>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001\u30d1\u30b9\u300c\/hello\/Jack\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_name() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217\u300cHello, Jack!\u300d\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001 @app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002Flask \u3067\u306f\u3001 @app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u7c21\u5358\u306b\u5b9a\u7fa9\u3057\u3001\u30b3\u30fc\u30c9\u3092\u3088\u308a\u7c21\u6f54\u3067\u8aad\u307f\u3084\u3059\u304f\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306e\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u5909\u6570\u3092\u542b\u3080 URL \u3092\u51e6\u7406\u3067\u304d\u307e\u3059\u3002\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u3055\u307e\u3056\u307e\u306a URL \u5909\u6570\u3092\u4f7f\u7528\u3067\u304d\u308b\u305f\u3081\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u3088\u308a\u67d4\u8edf\u3067\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306b\u306a\u308a\u307e\u3059\u3002\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570\u306e\u8a73\u7d30\u306a\u8aac\u660e\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<p>\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u5909\u6570\u3092\u542b\u3080 URL \u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u5909\u6570\u306f\u5c71\u304b\u3063\u3053 (&lt;&gt;) \u3067\u56f2\u307f\u3001\u30eb\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u5909\u6570\u306e\u578b\u3092\u5236\u9650\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001\u52d5\u7684\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u540d\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c8\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/hello\/&lt;name&gt;')\ndef hello_name(name):\n    return 'Hello, %s!' % name\n<\/code><\/pre>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001\u30d1\u30b9\u300c\/hello\/Jack\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001hello_name() \u30d3\u30e5\u30fc\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u6587\u5b57\u5217\u300cHello, Jack!\u300d\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>URL \u5909\u6570<\/li>\n<\/ol>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001URL \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30eb\u30fc\u30c8\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002URL \u5909\u6570\u306f\u5c71\u304b\u3063\u3053 (&lt;&gt;) \u3067\u56f2\u307e\u308c\u3001\u30eb\u30fc\u30c8\u5185\u306e\u5909\u6570\u3068\u540c\u3058\u540d\u524d\u306b\u306a\u308a\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u52d5\u7684\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u540d\u3092\u6301\u3064\u30eb\u30fc\u30c8\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u3001URL \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066 name \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/hello\/&lt;name&gt;')\ndef hello_name(name):\n    return 'Hello, %s!' % name\n<\/code><\/pre>\n\n\n\n<p>\u30d1\u30b9\u300c\/hello\/Jack\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f\u300cJack\u300d\u3092\u5f15\u6570\u3068\u3057\u3066 hello_name() \u30d3\u30e5\u30fc\u95a2\u6570\u306b\u6e21\u3057\u3001URL \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u305d\u306e\u5f15\u6570\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>URL \u5909\u6570\u30bf\u30a4\u30d7\u306e\u898f\u5247<\/li>\n<\/ol>\n\n\n\n<p>\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3067\u306f\u3001\u30bf\u30a4\u30d7 \u30eb\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066 URL \u5909\u6570\u306e\u30bf\u30a4\u30d7\u3092\u5236\u9650\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001int \u578b\u30eb\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066 age \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6574\u6570\u578b\u306b\u5236\u9650\u3057\u3066\u3001\u52d5\u7684\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc age \u3092\u6301\u3064\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/profile\/&lt;int:age&gt;')\ndef profile(age):\n    return 'Age is %d' % age\n<\/code><\/pre>\n\n\n\n<p>\u30d1\u30b9\u300c\/profile\/25\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f 25 \u3092\u6574\u6570\u578b\u306b\u5909\u63db\u3057\u3001\u305d\u308c\u3092 profile() \u30d3\u30e5\u30fc\u95a2\u6570\u306b\u5f15\u6570\u3068\u3057\u3066\u6e21\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3067\u306f\u3001\u52d5\u7684\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URL \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u5909\u6570\u3092\u542b\u3080 URL \u3092\u51e6\u7406\u3067\u304d\u308b\u305f\u3081\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u3088\u308a\u67d4\u8edf\u3067\u62e1\u5f35\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306b\u3064\u3044\u3066\u3001HTTP \u30e1\u30bd\u30c3\u30c9 (GET\u3001POST \u306a\u3069) \u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u306f\u3001GET\u3001POST\u3001PUT\u3001DELETE \u306a\u3069\u306e\u3055\u307e\u3056\u307e\u306a HTTP \u30ea\u30af\u30a8\u30b9\u30c8 \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3067\u304d\u307e\u3059\u3002HTTP \u8981\u6c42\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u30b5\u30fc\u30d0\u30fc\u306b\u5bfe\u3057\u3066\u958b\u59cb\u3057\u305f\u8981\u6c42\u306e\u30bf\u30a4\u30d7\u3092\u793a\u3057\u3001\u8981\u6c42\u30e1\u30bd\u30c3\u30c9\u3054\u3068\u306b\u30bb\u30de\u30f3\u30c6\u30a3\u30af\u30b9\u3068\u76ee\u7684\u304c\u7570\u306a\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001Flask \u30eb\u30fc\u30c8\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u304c HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3059\u308b\u65b9\u6cd5\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u306f HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3057\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001 @app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3068 methods \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30eb\u30fc\u30c8\u51e6\u7406\u7528\u306e HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002Methods \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306f\u3001[&#8216;GET&#8217;, &#8216;POST&#8217;] \u306a\u3069\u306e HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u542b\u3080\u30ea\u30b9\u30c8\u3067\u3042\u308a\u3001\u30eb\u30fc\u30c8\u304c GET \u304a\u3088\u3073 POST \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3067\u304d\u308b\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001GET \u304a\u3088\u3073 POST \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3067\u304d\u308b\u30eb\u30fc\u30c8\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    if request.method == 'POST':\n        # \u5904\u7406POST\u8bf7\u6c42\n        pass\n    else:\n        # \u5904\u7406GET\u8bf7\u6c42\n        pass\n<\/code><\/pre>\n\n\n\n<p>GET \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b9\u300c\/login\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f login() \u30d3\u30e5\u30fc\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3001GET \u8981\u6c42\u3092\u51e6\u7406\u3057\u307e\u3059\u3002POST \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b9\u300c\/login\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f login() \u30d3\u30e5\u30fc\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3001POST \u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d3\u30e5\u30fc\u95a2\u6570\u306f HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3057\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u306f request.method \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30ea\u30af\u30a8\u30b9\u30c8 \u30e1\u30bd\u30c3\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001GET \u304a\u3088\u3073 POST \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3067\u304d\u308b\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    if request.method == 'POST':\n        # \u5904\u7406POST\u8bf7\u6c42\n        pass\n    else:\n        # \u5904\u7406GET\u8bf7\u6c42\n        pass\n<\/code><\/pre>\n\n\n\n<p>GET \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b9\u300c\/login\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f login() \u30d3\u30e5\u30fc\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3001GET \u8981\u6c42\u3092\u51e6\u7406\u3057\u307e\u3059\u3002POST \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30b9\u300c\/login\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f login() \u30d3\u30e5\u30fc\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3001POST \u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u308c\u3067\u3001Flask \u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u304a\u3088\u3073\u30d3\u30e5\u30fc\u95a2\u6570\u304c HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3059\u308b\u65b9\u6cd5\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002Flask \u3067\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u6a5f\u80fd\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u304c GET\u3001POST\u3001PUT\u3001DELETE \u306a\u3069\u306e\u3055\u307e\u3056\u307e\u306a HTTP \u30ea\u30af\u30a8\u30b9\u30c8 \u30e1\u30bd\u30c3\u30c9\u3092\u51e6\u7406\u3067\u304d\u308b\u305f\u3081\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u3088\u308a\u67d4\u8edf\u3067\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306b\u306a\u308a\u307e\u3059\u3002@app.route() \u30c7\u30b3\u30ec\u30fc\u30bf\u3068 methods \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u51e6\u7406\u306e HTTP \u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3057\u3001request.method \u5c5e\u6027\u3092\u4f7f\u7528\u3057\u3066\u30ea\u30af\u30a8\u30b9\u30c8 \u30e1\u30bd\u30c3\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u6a5f\u80fd\u306e\u30ab\u30b9\u30bf\u30e0 HTTP \u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u3092\u4f7f\u7528\u3057\u3066\u3001\u30ab\u30b9\u30bf\u30e0 HTTP \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3001HTTP \u5fdc\u7b54\u30d8\u30c3\u30c0\u30fc\u3001\u304a\u3088\u3073 HTTP \u5fdc\u7b54\u672c\u6587\u3092\u8fd4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u306f\u3001\u30ab\u30b9\u30bf\u30e0 \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3092\u8fd4\u3059\u5fc5\u8981\u304c\u3042\u308b API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3001\u30ab\u30b9\u30bf\u30e0\u5fdc\u7b54\u30d8\u30c3\u30c0\u30fc\u3092\u8fd4\u3059\u5fc5\u8981\u304c\u3042\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3001\u30ab\u30b9\u30bf\u30e0 \u30c6\u30ad\u30b9\u30c8\u3092\u8fd4\u3059\u5fc5\u8981\u304c\u3042\u308b\u30a8\u30e9\u30fc \u30da\u30fc\u30b8\u306a\u3069\u3001\u3044\u304f\u3064\u304b\u306e\u7279\u6b8a\u306a\u30b1\u30fc\u30b9\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001Flask \u30eb\u30fc\u30c8\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u306e HTTP \u5fdc\u7b54\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0 \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3092\u8fd4\u3059<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001make_response() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3001response.status_code \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u30ab\u30b9\u30bf\u30e0 \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9 418 (I&#8217;m a teapot) \u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, make_response\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    response = make_response('Hello, World!')\n    response.status_code = 418\n    return response\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9 &#8216;\/&#8217; \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f\u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9 418 \u3068\u6587\u5b57\u5217 &#8216;Hello, World!&#8217; \u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30ab\u30b9\u30bf\u30e0 \u30ec\u30b9\u30dd\u30f3\u30b9 \u30d8\u30c3\u30c0\u30fc\u3092\u8fd4\u3059<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001make_response() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3001response.headers \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u30d8\u30c3\u30c0\u30fc\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u30ab\u30b9\u30bf\u30e0 \u30ec\u30b9\u30dd\u30f3\u30b9 \u30d8\u30c3\u30c0\u30fc Content-Disposition \u3092\u8fd4\u3057\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u3088\u3046\u306b\u4fc3\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, make_response\n\napp = Flask(__name__)\n\n@app.route('\/download')\ndef download():\n    response = make_response('Hello, World!')\n    response.headers['Content-Disposition'] = 'attachment; filename=file.txt'\n    return response\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30d1\u30b9 &#8216;\/download&#8217; \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u306e Content-Disposition \u3068\u3044\u3046\u5fdc\u7b54\u30d8\u30c3\u30c0\u30fc\u3092\u8fd4\u3057\u3001\u30d6\u30e9\u30a6\u30b6\u30fc\u306b file.txt \u3068\u3044\u3046\u540d\u524d\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u3088\u3046\u306b\u4fc3\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30ab\u30b9\u30bf\u30e0 \u30ec\u30b9\u30dd\u30f3\u30b9\u672c\u6587\u3092\u8fd4\u3059<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001\u30ab\u30b9\u30bf\u30e0 \u30ec\u30b9\u30dd\u30f3\u30b9 \u30dc\u30c7\u30a3\u3092\u4f7f\u7528\u3057\u3066\u3001\u30ab\u30b9\u30bf\u30e0 HTML \u30da\u30fc\u30b8\u3001\u30a8\u30e9\u30fc \u30da\u30fc\u30b8\u306a\u3069\u3092\u8fd4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u30ab\u30b9\u30bf\u30e0 HTML \u30da\u30fc\u30b8\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    return '&lt;html&gt;&lt;body&gt;&lt;h1&gt;Hello, World!&lt;\/h1&gt;&lt;\/body&gt;&lt;\/html&gt;'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u30eb\u30fc\u30c8 \u30d1\u30b9\u300c\/\u300d\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001Flask \u306f &lt;h1&gt;Hello, World!&lt;\/h1&gt; \u3092\u542b\u3080 HTML \u30da\u30fc\u30b8\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001Flask \u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d3\u30e5\u30fc\u95a2\u6570\u306e\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3067\u306f\u3001make_response() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u5fdc\u7b54\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3001response.status_code\u3001response.headers\u3001\u304a\u3088\u3073 response.data \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30ab\u30b9\u30bf\u30e0 HTTP \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3001HTTP \u5fdc\u7b54\u30d8\u30c3\u30c0\u30fc\u3001\u304a\u3088\u3073 HTTP \u5fdc\u7b54\u672c\u6587\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002 HTTP\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u6a5f\u80fd\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068Jinja2\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u57fa\u672c\u6982\u5ff5\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Web \u958b\u767a\u3067\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u9759\u7684\u30da\u30fc\u30b8 \u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u624b\u6cd5\u3067\u3059\u3002Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u751f\u6210\u3057\u307e\u3059\u3002\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068 Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u8a73\u7d30\u306a\u8aac\u660e\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ec\u30f3\u30d7\u30ec\u30fc\u30c8<\/li>\n<\/ol>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u9759\u7684\u30da\u30fc\u30b8 \u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u624b\u6cd5\u3067\u3059\u3002Web \u958b\u767a\u3067\u306f\u3001\u901a\u5e38\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684 HTML \u30da\u30fc\u30b8\u3092\u751f\u6210\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3084\u691c\u7d22\u7d50\u679c\u306a\u3069\u306e\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30e6\u30fc\u30b6\u30fc\u306b\u8868\u793a\u3057\u307e\u3059\u3002\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u306f\u901a\u5e38\u3001HTML \u30de\u30fc\u30af\u30a2\u30c3\u30d7\u3068\u3044\u304f\u3064\u304b\u306e\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u304c\u542b\u307e\u308c\u3066\u304a\u308a\u3001\u3053\u308c\u3089\u306f\u52d5\u7684\u30c7\u30fc\u30bf\u306b\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u751f\u6210\u3067\u304d\u307e\u3059\u3002Jinja2 \u306f\u3001Django \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u8a00\u8a9e\u306b\u4f3c\u305f\u69cb\u6587\u3092\u4f7f\u7528\u3059\u308b\u3001\u4eba\u6c17\u306e\u3042\u308b Python \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3067\u3059\u3002Jinja2 \u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u9759\u7684\u30da\u30fc\u30b8 \u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u5206\u96e2\u3057\u3066\u3001\u4fdd\u5b88\u3068\u7ba1\u7406\u3092\u7c21\u5358\u306b\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3<\/li>\n<\/ol>\n\n\n\n<p>Jinja2 \u306f\u3001Django \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u8a00\u8a9e\u306b\u4f3c\u305f\u69cb\u6587\u3092\u4f7f\u7528\u3059\u308b\u3001\u4eba\u6c17\u306e\u3042\u308b Python \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3067\u3059\u3002Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7c21\u5358\u306b\u751f\u6210\u3067\u304d\u307e\u3059\u3002Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306f\u3001\u6b21\u306e\u6a5f\u80fd\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5909\u6570: {{}} \u306b\u542b\u307e\u308c\u308b\u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u8868\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u5236\u5fa1\u69cb\u9020: {% %} \u306b\u542b\u307e\u308c\u308b\u5236\u5fa1\u69cb\u9020\u3092\u4f7f\u7528\u3057\u3066\u3001\u6761\u4ef6\u3084\u30eb\u30fc\u30d7\u306a\u3069\u306e\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u8868\u73fe\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u7d99\u627f: {% extends %} \u3068 {% block %} \u3092\u4f7f\u7528\u3057\u3066\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3068\u66f8\u304d\u63db\u3048\u3092\u8868\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30d5\u30a3\u30eb\u30bf\u30fc: | \u3092\u4f7f\u7528\u3057\u3066\u3001\u5909\u6570\u3092\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u304a\u3088\u3073\u5909\u63db\u3067\u304d\u308b\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u793a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30de\u30af\u30ed: {% \u30de\u30af\u30ed %} \u3092\u4f7f\u7528\u3057\u3066\u30de\u30af\u30ed\u3092\u5b9a\u7fa9\u3059\u308b\u3068\u3001\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4e00\u90e8\u3092\u518d\u5229\u7528\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u542b\u3080 HTML \u30da\u30fc\u30b8\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    user = {'username': 'Jack'}\n    return render_template('index.html', title='Home', user=user)\n<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u4e2d\u3067 render_template() \u95a2\u6570\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u751f\u6210\u3057\u307e\u3059\u3002index.html \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{{}} \u306b\u542b\u307e\u308c\u308b\u5909\u6570 user.username \u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068 Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7c21\u5358\u306b\u751f\u6210\u3067\u304d\u308b\u305f\u3081\u3001Web \u958b\u767a\u304c\u3088\u308a\u7c21\u5358\u304b\u3064\u52b9\u7387\u7684\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>render_template \u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3067\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7c21\u5358\u306b\u751f\u6210\u3067\u304d\u307e\u3059\u3002render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u7d44\u307f\u5408\u308f\u305b\u3066 HTML \u30da\u30fc\u30b8\u3092\u751f\u6210\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u307e\u305a\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e templates \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u901a\u5e38\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u9759\u7684\u30da\u30fc\u30b8 \u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7d50\u5408\u3059\u308b\u305f\u3081\u306e HTML \u30de\u30fc\u30af\u30a2\u30c3\u30d7\u3068 Jinja2 \u69cb\u6587\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u542b\u3080 index.html \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n  &lt;head&gt;\n    &lt;title&gt;{{ title }}&lt;\/title&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n    &lt;h1&gt;Hello, {{ user.username }}!&lt;\/h1&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001{{}} \u306b\u542b\u307e\u308c\u308b\u5909\u6570\u306f\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u8868\u3059\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001\u5909\u6570\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6e21\u3059\u3053\u3068\u3067\u7f6e\u304d\u63db\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u3067\u306f\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u95a2\u6570\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3068\u52d5\u7684\u30c7\u30fc\u30bf\u306e\u540d\u524d\u3092\u6307\u5b9a\u3057\u3001\u305d\u308c\u3089\u3092\u7d44\u307f\u5408\u308f\u305b\u3066 HTML \u30da\u30fc\u30b8\u3092\u751f\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u4e0a\u8a18\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    user = {'username': 'Jack'}\n    return render_template('index.html', title='Home', user=user)\n<\/code><\/pre>\n\n\n\n<p>index() \u30d3\u30e5\u30fc\u95a2\u6570\u3067\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u307e\u3059\u3002\u3053\u306e\u3046\u3061\u3001\u300cindex.html\u300d\u306f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u540d\u524d\u3092\u8868\u3057\u3001\u30bf\u30a4\u30c8\u30eb\u3068\u30e6\u30fc\u30b6\u30fc\u306f\u52d5\u7684\u30c7\u30fc\u30bf\u3067\u3059\u3002\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u306f {{ title }} \u3068 {{ user.username }} \u3067\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u306f {{}} \u306b\u542b\u307e\u308c\u308b\u5909\u6570\u3067\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002render_template() \u95a2\u6570\u3067\u306f\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u5f15\u6570\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u6e21\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u5f15\u6570 user \u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u6e21\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    user = {'username': 'Jack'}\n    return render_template('index.html', user=user)\n<\/code><\/pre>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u306f {{ user.username }} \u3067\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3067\u306f\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3068\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u7d44\u307f\u5408\u308f\u305b\u3066 HTML \u30da\u30fc\u30b8\u3092\u751f\u6210\u3057\u3001Web \u958b\u767a\u3092\u3088\u308a\u7c21\u5358\u304b\u3064\u52b9\u7387\u7684\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068 Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3068\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Web \u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u7d99\u627f\u3068\u306f\u3001\u8907\u6570\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092 1 \u3064\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u7d50\u5408\u3059\u308b\u6280\u8853\u3067\u3042\u308a\u3001\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u3068\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3068\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3068\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f<\/li>\n<\/ol>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u7d99\u627f\u3068\u306f\u3001\u8907\u6570\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u3072\u3068\u3064\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u3084\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406\u3092\u5b9f\u73fe\u3059\u308b\u6280\u8853\u3067\u3059\u3002Flask \u3067\u306f\u3001{% extends %} \u304a\u3088\u3073 {% block %} \u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002{% extends %} \u30bf\u30b0\u306f\u30d9\u30fc\u30b9 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u6307\u5b9a\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001{% block %} \u30bf\u30b0\u306f\u7f6e\u63db\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u6307\u5b9a\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u3092\u542b\u3080 base.html \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n  &lt;head&gt;\n    &lt;title&gt;{% block title %}{% endblock %}&lt;\/title&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n    {% block content %}{% endblock %}\n  &lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<p>\u57fa\u672c\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{% block %} \u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u3001{% block title %} \u3084 {% block content %} \u306a\u3069\u3001\u7f6e\u304d\u63db\u3048\u308b\u5fc5\u8981\u304c\u3042\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u7d99\u627f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{% extends %} \u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u57fa\u672c\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u6307\u5b9a\u3057\u3001{% block %} \u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u7f6e\u63db\u304c\u5fc5\u8981\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001base.html \u30d9\u30fc\u30b9 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304b\u3089\u7d99\u627f\u3059\u308b index.html \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>{% extends 'base.html' %}\n\n{% block title %}Home{% endblock %}\n\n{% block content %}\n  &lt;h1&gt;Hello, {{ user.username }}!&lt;\/h1&gt;\n{% endblock %}\n<\/code><\/pre>\n\n\n\n<p>\u7d99\u627f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u3001{% extends &#8216;base.html&#8217; %} \u3092\u4f7f\u7528\u3057\u3066\u30d9\u30fc\u30b9 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092 base.html \u3068\u3057\u3066\u6307\u5b9a\u3057\u307e\u3059\u3002\u6b21\u306b\u3001{% block title %} \u3068 {% block content %} \u3092\u4f7f\u7528\u3057\u3066\u3001\u30d9\u30fc\u30b9 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u5bfe\u5fdc\u3059\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u305d\u308c\u305e\u308c\u66f8\u304d\u63db\u3048\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528<\/li>\n<\/ol>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7d99\u627f\u306f\u3001\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u3092\u5b9f\u73fe\u3059\u308b\u3060\u3051\u3067\u306a\u304f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7ba1\u7406\u3068\u4fdd\u5b88\u306e\u52b9\u7387\u3082\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002Flask \u3067\u306f\u3001\u30de\u30af\u30ed (\u30de\u30af\u30ed) \u3068\u30a4\u30f3\u30af\u30eb\u30fc\u30c9 (\u30a4\u30f3\u30af\u30eb\u30fc\u30c9) \u3092\u4f7f\u7528\u3057\u3066\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b8f<\/li>\n<\/ul>\n\n\n\n<p>\u30de\u30af\u30ed\u306f\u3001\u95a2\u6570\u3084\u30b5\u30d6\u30eb\u30fc\u30c1\u30f3\u3068\u540c\u69d8\u306b\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u5b9a\u7fa9\u3055\u308c\u305f\u518d\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30fc\u30c9 \u30d6\u30ed\u30c3\u30af\u3067\u3059\u3002Jinja2 \u3067\u306f\u3001\u30de\u30af\u30ed\u306f {% macro %} \u3068 {% endmacro %} \u3092\u4f7f\u7528\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u3001\u30de\u30af\u30ed\u306f {{ macro_name() }} \u3092\u4f7f\u7528\u3057\u3066\u547c\u3073\u51fa\u3055\u308c\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30de\u30af\u30ed\u3092\u5b9a\u7fa9\u3059\u308b macro.html \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>{% macro hello(name) %}\n  &lt;h1&gt;Hello, {{ name }}!&lt;\/h1&gt;\n{% endmacro %}\n<\/code><\/pre>\n\n\n\n<p>\u30de\u30af\u30ed\u3067\u306f\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u6e21\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u3001\u4ed6\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067 {{ hello(&#8216;Jack&#8217;) }} \u3092\u4f7f\u7528\u3057\u3066\u30de\u30af\u30ed\u3092\u547c\u3073\u51fa\u3057\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6e21\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>{% extends 'base.html' %}\n\n{% block title %}Home{% endblock %}\n\n{% block content %}\n  {{ hello('Jack') }}\n{% endblock %}\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u4f8b\u3067\u306f\u3001{{ hello(&#8216;Jack&#8217;) }} \u304c\u30de\u30af\u30ed\u3092\u547c\u3073\u51fa\u3057\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6e21\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3068 Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306b\u3064\u3044\u3066\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u69cb\u6587 (\u5909\u6570\u3001\u30d5\u30a3\u30eb\u30bf\u30fc\u3001\u30bf\u30b0\u306a\u3069) \u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7c21\u5358\u306b\u751f\u6210\u3067\u304d\u307e\u3059\u3002Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5185\u306e\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306b\u3001\u5909\u6570\u3001\u30d5\u30a3\u30eb\u30bf\u30fc\u3001\u30bf\u30b0\u306a\u3069\u3092\u542b\u3080\u3044\u304f\u3064\u304b\u306e\u7279\u5225\u306a\u69cb\u6587\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5909\u6570<\/li>\n<\/ol>\n\n\n\n<p>\u5909\u6570\u306f\u3001\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u8868\u3059\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5185\u306e\u30d7\u30ec\u30fc\u30b9\u30db\u30eb\u30c0\u30fc\u3067\u3059\u3002Jinja2 \u3067\u306f\u3001{{ variable_name }} \u3092\u4f7f\u7528\u3057\u3066\u5909\u6570\u3092\u8868\u3057\u307e\u3059\u3002\u3053\u3053\u3067\u3001variable_name \u306f\u3001\u7f6e\u63db\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u52d5\u7684\u30c7\u30fc\u30bf\u3067\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306e name \u5909\u6570\u306f\u52d5\u7684\u30c7\u30fc\u30bf\u306b\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;h1&gt;Hello, {{ name }}!&lt;\/h1&gt;\n<\/code><\/pre>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001render_template() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u3092\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u6e21\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    name = 'Jack'\n    return render_template('index.html', name=name)\n<\/code><\/pre>\n\n\n\n<p>render_template() \u95a2\u6570\u3067\u306f\u3001name \u30ad\u30fc\u30ef\u30fc\u30c9\u5f15\u6570\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30c7\u30fc\u30bf\u304c\u6e21\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30a3\u30eb\u30bf\u30fc<\/li>\n<\/ol>\n\n\n\n<p>\u30d5\u30a3\u30eb\u30bf\u30fc\u306f\u3001\u3088\u308a\u8c4a\u5bcc\u3067\u67d4\u8edf\u306a\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u751f\u6210\u3059\u308b\u305f\u3081\u306b\u5909\u6570\u3092\u51e6\u7406\u304a\u3088\u3073\u5909\u63db\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002Jinja2 \u3067\u306f\u3001| \u8a18\u53f7\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u793a\u3057\u3001\u305d\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u5909\u6570\u306b\u9069\u7528\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001upper \u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066 name \u5909\u6570\u3092\u5927\u6587\u5b57\u306b\u5909\u63db\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;h1&gt;Hello, {{ name|upper }}!&lt;\/h1&gt;\n<\/code><\/pre>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Jinja2 \u304c\u63d0\u4f9b\u3059\u308b\u3055\u307e\u3056\u307e\u306a\u7d44\u307f\u8fbc\u307f\u30d5\u30a3\u30eb\u30bf\u30fc (capitalize\u3001lower\u3001date \u306a\u3069) \u3092\u4f7f\u7528\u3057\u305f\u308a\u3001\u7279\u5b9a\u306e\u30cb\u30fc\u30ba\u306b\u5408\u308f\u305b\u3066\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305f\u308a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30e9\u30d9\u30eb<\/li>\n<\/ol>\n\n\n\n<p>\u30bf\u30b0\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0 \u30d7\u30ed\u30bb\u30b9\u3092\u5236\u5fa1\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u3001\u30eb\u30fc\u30d7\u3001\u6761\u4ef6\u3001\u30de\u30af\u30ed\u3001\u7d99\u627f\u306a\u3069\u306e\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002Jinja2 \u3067\u306f\u3001\u30bf\u30b0\u306f {% %} \u3092\u4f7f\u7528\u3057\u3066\u8868\u73fe\u3055\u308c\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0 \u30d7\u30ed\u30bb\u30b9\u3092\u5236\u5fa1\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u306f\u3001{% if %} \u304a\u3088\u3073 {% else %} \u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u6761\u4ef6\u4ed8\u304d\u5236\u5fa1\u3092\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>{% if user %}\n  &lt;h1&gt;Hello, {{ user.username }}!&lt;\/h1&gt;\n{% else %}\n  &lt;h1&gt;Hello, Guest!&lt;\/h1&gt;\n{% endif %}\n<\/code><\/pre>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3055\u307e\u3056\u307e\u306a\u30bf\u30b0\u3092\u4f7f\u7528\u3057\u3066\u3001\u30eb\u30fc\u30d7\u3001\u30de\u30af\u30ed\u3001\u7d99\u627f\u306a\u3069\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u3067\u306f\u3001Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u7c21\u5358\u306b\u751f\u6210\u3067\u304d\u308b\u305f\u3081\u3001Web \u958b\u767a\u304c\u3088\u308a\u7c21\u5358\u304b\u3064\u52b9\u7387\u7684\u306b\u306a\u308a\u307e\u3059\u3002Jinja2 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u30a8\u30f3\u30b8\u30f3\u306e\u69cb\u6587\u306f\u30b7\u30f3\u30d7\u30eb\u3067\u7fd2\u5f97\u304c\u5bb9\u6613\u3067\u3042\u308b\u3068\u540c\u6642\u306b\u3001\u8c4a\u5bcc\u306a\u6a5f\u80fd\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7ba1\u7406\u3068\u4fdd\u5b88\u304c\u3088\u308a\u52b9\u7387\u7684\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u51e6\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask-WTF \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3059\u308b<\/p>\n\n\n\n<p>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u9001\u4fe1\u3057\u305f\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308b\u305f\u3081\u306e\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u65b9\u6cd5\u3067\u3059\u3002Flask \u3067\u306f\u3001Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u3001\u30c7\u30fc\u30bf\u51e6\u7406\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306a\u3069\u306e\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3067\u304d\u307e\u3059\u3002Flask-WTF \u3067\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3092\u4f7f\u7528\u3059\u308b\u524d\u306b\u3001Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install Flask-WTF\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u69cb\u9020\u3068\u30eb\u30fc\u30eb\u3092\u5b9a\u7fa9\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b Python \u30af\u30e9\u30b9\u3067\u3059\u3002\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u5165\u529b\u3068\u691c\u8a3c\u3092\u5236\u5fa1\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3059\u308b LoginForm \u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_wtf import FlaskForm\nfrom wtforms import StringField, PasswordField, SubmitField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(FlaskForm):\n    username = StringField('Username', validators=[DataRequired()])\n    password = PasswordField('Password', validators=[DataRequired()])\n    submit = SubmitField('Sign In')\n<\/code><\/pre>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3067\u306f\u3001\u3055\u307e\u3056\u307e\u306a\u30d5\u30a3\u30fc\u30eb\u30c9 \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u5165\u529b\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb (StringField\u3001PasswordField\u3001SubmitField \u306a\u3069) \u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u3055\u307e\u3056\u307e\u306a\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001DataRequired\u3001Length\u3001Email \u306a\u3069\u306e\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u30eb\u30fc\u30eb\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u306e\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001request.form \u5c5e\u6027\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u306f\u3001\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u53d7\u4fe1\u304a\u3088\u3073\u51e6\u7406\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template, request, redirect, url_for\nfrom forms import LoginForm\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret_key'\n\n@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    form = LoginForm()\n    if form.validate_on_submit():\n        username = form.username.data\n        password = form.password.data\n        # process data\n        return redirect(url_for('success'))\n    return render_template('login.html', form=form)\n\n@app.route('\/success')\ndef success():\n    return 'Success!'\n<\/code><\/pre>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001LoginForm() \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0 \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3057\u3001\u6b21\u306b form.validate_on_submit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u304c\u9001\u4fe1\u3055\u308c\u305f\u304b\u3069\u3046\u304b\u3092\u5224\u65ad\u3057\u307e\u3059\u3002\u30d5\u30a9\u30fc\u30e0\u304c\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u308b\u3068\u3001form.username.data \u3068 form.password.data \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3001\u30c7\u30fc\u30bf\u306e\u51e6\u7406\u3084\u30b8\u30e3\u30f3\u30d7\u306a\u3069\u306e\u64cd\u4f5c\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30d5\u30a9\u30fc\u30e0 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001\u30d5\u30a9\u30fc\u30e0 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u306f {% raw %}{{ form.field_name }}{% enddraw %} \u3092\u4f7f\u7528\u3057\u3066\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;form method=\"POST\"&gt;\n    {{ form.username.label }} {{ form.username() }}\n    {{ form.password.label }} {{ form.password() }}\n    {{ form.submit() }}\n&lt;\/form&gt;\n<\/code><\/pre>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{{ form.field_name.label }} \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0 \u30e9\u30d9\u30eb\u3092\u53d6\u5f97\u3057\u3001{{ form.field_name() }} \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001Flask-WTF \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3059\u308b\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask-WTF \u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u52b9\u7387\u7684\u3067\u30b7\u30f3\u30d7\u30eb\u304b\u3064\u5b89\u5168\u306a\u65b9\u6cd5\u3092\u63d0\u4f9b\u3057\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u3001\u30c7\u30fc\u30bf\u51e6\u7406\u3001\u304a\u3088\u3073\u30a8\u30e9\u30fc\u51e6\u7406\u3092\u3088\u308a\u7c21\u5358\u304b\u3064\u67d4\u8edf\u306b\u3057\u307e\u3059\u3002Flask-WTF \u3092\u4ecb\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u3092\u51e6\u7406\u3059\u308b\u3068\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u304c\u3088\u308a\u4fbf\u5229\u3067\u5b89\u5168\u306b\u306a\u308a\u307e\u3059<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u6b63\u78ba\u6027\u3092\u78ba\u4fdd\u3057\u306a\u304c\u3089\u3001\u30e6\u30fc\u30b6\u30fc \u30a8\u30af\u30b9\u30da\u30ea\u30a8\u30f3\u30b9\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u8a73\u7d30\u306a\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u53d6\u308a\u6271\u3044\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 CSRF \u4fdd\u8b77<\/p>\n\n\n\n<p>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u304a\u3044\u3066\u3001CSRF (\u30af\u30ed\u30b9\u30b5\u30a4\u30c8 \u30ea\u30af\u30a8\u30b9\u30c8 \u30d5\u30a9\u30fc\u30b8\u30a7\u30ea) \u306f\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u60c5\u5831\u6f0f\u3048\u3044\u3084\u8aa4\u64cd\u4f5c\u306b\u3064\u306a\u304c\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4e0a\u306e\u8106\u5f31\u6027\u3067\u3059\u3002Flask \u3067\u306f\u3001Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b CSRF \u4fdd\u8b77\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3001CSRF \u653b\u6483\u3092\u9632\u304e\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001CSRF \u4fdd\u8b77\u3092\u51e6\u7406\u3059\u308b\u30d5\u30a9\u30fc\u30e0\u304a\u3088\u3073\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>CSRF \u4fdd\u8b77\u3092\u6709\u52b9\u306b\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001app.config[&#8216;SECRET_KEY&#8217;] \u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067 CSRF \u4fdd\u8b77\u3092\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_wtf.csrf import CSRFProtect\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret_key'\ncsrf = CSRFProtect(app)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001app.config[&#8216;SECRET_KEY&#8217;] \u3092\u4f7f\u7528\u3057\u3066\u3001CSRF \u30c8\u30fc\u30af\u30f3\u3092\u751f\u6210\u304a\u3088\u3073\u691c\u8a3c\u3059\u308b\u305f\u3081\u306e\u79d8\u5bc6\u9375\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u6b21\u306b\u3001CSRFProtect(app) \u3092\u4f7f\u7528\u3057\u3066\u3001CSRF \u4fdd\u8b77\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>CSRF\u30c8\u30fc\u30af\u30f3\u3092\u30d5\u30a9\u30fc\u30e0\u306b\u8ffd\u52a0<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001{{ form.csrf_token }} \u3092\u4f7f\u7528\u3057\u3066 CSRF \u30c8\u30fc\u30af\u30f3\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;form method=\"POST\"&gt;\n    {{ form.csrf_token }}\n    {{ form.username.label }} {{ form.username() }}\n    {{ form.password.label }} {{ form.password() }}\n    {{ form.submit() }}\n&lt;\/form&gt;\n<\/code><\/pre>\n\n\n\n<p>{{ form.csrf_token }} \u3092\u30d5\u30a9\u30fc\u30e0\u306b\u8ffd\u52a0\u3059\u308b\u3068\u3001CSRF \u653b\u6483\u3092\u9632\u3050\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b CSRF \u30c8\u30fc\u30af\u30f3\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>CSRF \u30c8\u30fc\u30af\u30f3\u3092\u78ba\u8a8d\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001validate_csrf() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066 CSRF \u30c8\u30fc\u30af\u30f3\u3092\u691c\u8a3c\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u30d3\u30e5\u30fc\u95a2\u6570\u306b\u8ffd\u52a0\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template, request, redirect, url_for\nfrom forms import LoginForm\nfrom flask_wtf.csrf import CSRFProtect, validate_csrf\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret_key'\ncsrf = CSRFProtect(app)\n\n@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    form = LoginForm()\n    if form.validate_on_submit():\n        validate_csrf(form.csrf_token.data)\n        username = form.username.data\n        password = form.password.data\n        # process data\n        return redirect(url_for('success'))\n    return render_template('login.html', form=form)\n\n@app.route('\/success')\ndef success():\n    return 'Success!'\n<\/code><\/pre>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001validate_csrf(form.csrf_token.data) \u3092\u4f7f\u7528\u3057\u3066 CSRF \u30c8\u30fc\u30af\u30f3\u306e\u6b63\u5f53\u6027\u3092\u691c\u8a3c\u3057\u3001\u30c8\u30fc\u30af\u30f3\u304c\u7121\u52b9\u306a\u5834\u5408\u306f\u4f8b\u5916\u3092\u30b9\u30ed\u30fc\u3057\u307e\u3059\u3002CSRF \u653b\u6483\u306f\u3001validate_csrf() \u30e1\u30bd\u30c3\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u52b9\u679c\u7684\u306b\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u304a\u3088\u3073\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u51e6\u7406\u306e CSRF \u4fdd\u8b77\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-WTF \u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b CSRF \u4fdd\u8b77\u30e1\u30ab\u30cb\u30ba\u30e0\u306b\u3088\u308a\u3001CSRF \u653b\u6483\u3092\u52b9\u679c\u7684\u306b\u9632\u6b62\u3057\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002CSRF \u30c8\u30fc\u30af\u30f3\u3092\u8ffd\u52a0\u3057\u3001CSRF \u30c8\u30fc\u30af\u30f3\u3092\u691c\u8a3c\u3059\u308b\u3053\u3068\u3067\u3001\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u3092\u4fdd\u8b77\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u3068\u30e6\u30fc\u30b6\u30fc \u30a8\u30af\u30b9\u30da\u30ea\u30a8\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u306f\u3001\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u306e\u6b63\u5f53\u6027\u3068\u6b63\u78ba\u6027\u3092\u4fdd\u8a3c\u3059\u308b\u305f\u3081\u306e\u91cd\u8981\u306a\u30b9\u30c6\u30c3\u30d7\u3067\u3059\u3002Flask \u3067\u306f\u3001Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf\u578b\u3001\u30c7\u30fc\u30bf\u5f62\u5f0f\u3001\u30c7\u30fc\u30bf\u9577\u306a\u3069\u306e\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u3092\u691c\u8a3c\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u898f\u5247\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3067\u3055\u307e\u3056\u307e\u306a\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u898f\u5247\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DataRequired: \u691c\u8a3c\u5165\u529b\u3092\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093<\/li>\n\n\n\n<li>\u96fb\u5b50\u30e1\u30fc\u30eb: \u5165\u529b\u304c\u96fb\u5b50\u30e1\u30fc\u30eb\u5f62\u5f0f\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u691c\u8a3c\u3057\u307e\u3059<\/li>\n\n\n\n<li>\u9577\u3055: \u5165\u529b\u306e\u9577\u3055\u304c\u6307\u5b9a\u3055\u308c\u305f\u7bc4\u56f2\u5185\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059<\/li>\n\n\n\n<li>Regexp: \u6b63\u898f\u8868\u73fe\u30eb\u30fc\u30eb\u306b\u5bfe\u3057\u3066\u5165\u529b\u3092\u691c\u8a3c\u3057\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u30eb\u30fc\u30eb\u3092\u5b9a\u7fa9\u3059\u308b LoginForm \u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_wtf import FlaskForm\nfrom wtforms import StringField, PasswordField, SubmitField\nfrom wtforms.validators import DataRequired, Length, Regexp, Email\n\nclass LoginForm(FlaskForm):\n    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=20)])\n    password = PasswordField('Password', validators=[DataRequired(), Regexp('^[\\w.@+-]+$', message='Invalid password')])\n    email = StringField('Email', validators=[DataRequired(), Email()])\n    submit = SubmitField('Sign In')\n<\/code><\/pre>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3067\u306f\u3001\u3055\u307e\u3056\u307e\u306a\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u898f\u5247\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u6b63\u898f\u8868\u73fe\u30eb\u30fc\u30eb\u3001\u304a\u3088\u3073\u96fb\u5b50\u30e1\u30fc\u30eb \u30d5\u30a3\u30fc\u30eb\u30c9\u306f\u975e null \u3067\u3042\u308a\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u5f62\u5f0f\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u306e\u691c\u8a3c<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001 form.validate_on_submit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u304c\u691c\u8a3c\u898f\u5247\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u691c\u8a3c\u3067\u304d\u307e\u3059\u3002\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u304c\u7a7a\u3067\u306a\u3044\u304b\u3069\u3046\u304b\u3001\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u8981\u4ef6\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u306a\u3069\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002\u30d5\u30a9\u30fc\u30e0\u306e\u691c\u8a3c\u306b\u5408\u683c\u3057\u305f\u5834\u5408\u306f True \u3092\u8fd4\u3057\u3001\u305d\u308c\u4ee5\u5916\u306e\u5834\u5408\u306f False \u3092\u8fd4\u3057\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template, request, redirect, url_for\nfrom forms import LoginForm\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret_key'\n\n@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    form = LoginForm()\n    if form.validate_on_submit():\n        username = form.username.data\n        password = form.password.data\n        email = form.email.data\n        # process data\n        return redirect(url_for('success'))\n    return render_template('login.html', form=form)\n\n@app.route('\/success')\ndef success():\n    return 'Success!'\n<\/code><\/pre>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001form.validate_on_submit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u304c\u691c\u8a3c\u898f\u5247\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u691c\u8a3c\u3057\u307e\u3059\u3002\u30d5\u30a9\u30fc\u30e0\u304c\u691c\u8a3c\u6e08\u307f\u306e\u5834\u5408\u306f\u3001form.field_name.data \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0 \u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3001\u30c7\u30fc\u30bf\u306e\u51e6\u7406\u3084\u30b8\u30e3\u30f3\u30d7\u306a\u3069\u306e\u64cd\u4f5c\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u30a8\u30e9\u30fc\u306e\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001form.errors \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{{ form.field_name.errors }} \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u30a8\u30e9\u30fc \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;form method=\"POST\"&gt;\n    {{ form.username.label }} {{ form.username() }}\n    {% if form.username.errors %}\n        &lt;ul&gt;\n        {% for error in form.username.errors %}\n            &lt;li&gt;{{ error }}&lt;\/li&gt;\n        {% endfor %}\n        &lt;\/ul&gt;\n    {% endif %}\n    {{ form.password.label }} {{ form.password\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306f\u3001\u3055\u307e\u3056\u307e\u306a\u7a2e\u985e\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u305f\u3081\u306e\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u65b9\u6cd5\u3067\u3059\u3002Flask \u3067\u306f\u3001Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a1\u30a4\u30eb \u30b5\u30a4\u30ba\u3001\u30d5\u30a1\u30a4\u30eb \u30bf\u30a4\u30d7\u3001\u30d5\u30a1\u30a4\u30eb \u30b9\u30c8\u30ec\u30fc\u30b8\u306a\u3069\u306e\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u51e6\u7406\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001FileField \u30d5\u30a3\u30fc\u30eb\u30c9 \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_wtf import FlaskForm\nfrom flask_wtf.file import FileField, FileAllowed, FileRequired\nfrom wtforms import SubmitField\n\nclass UploadForm(FlaskForm):\n    file = FileField('Upload File', validators=[FileRequired(), FileAllowed(['txt', 'pdf', 'doc'])])\n    submit = SubmitField('Upload')\n<\/code><\/pre>\n\n\n\n<p>\u30d5\u30a9\u30fc\u30e0 \u30af\u30e9\u30b9\u3067\u306f\u3001FileField \u30d5\u30a3\u30fc\u30eb\u30c9 \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u5b9a\u7fa9\u3057\u3001FileRequired() \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a1\u30a4\u30eb\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u3001FileAllowed() \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb \u30bf\u30a4\u30d7\u304c\u6307\u5b9a\u3055\u308c\u305f\u5f62\u5f0f\u306b\u6e96\u62e0\u3057\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u51e6\u7406\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u3067\u306f\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306f request.files \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u3066\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template, request, redirect, url_for\nfrom forms import UploadForm\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret_key'\n\n@app.route('\/upload', methods=['GET', 'POST'])\ndef upload():\n    form = UploadForm()\n    if form.validate_on_submit():\n        file = form.file.data\n        filename = secure_filename(file.filename)\n        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))\n        # process file\n        return redirect(url_for('success'))\n    return render_template('upload.html', form=form)\n\n@app.route('\/success')\ndef success():\n    return 'Success!'\n<\/code><\/pre>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001form.validate_on_submit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d5\u30a9\u30fc\u30e0\u304c\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u305f\u304b\u3069\u3046\u304b\u3092\u691c\u8a3c\u3057\u307e\u3059. \u6210\u529f\u3057\u305f\u5834\u5408\u306f\u3001request.files \u5c5e\u6027\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb \u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059.&nbsp;\u6b21\u306b\u3001secure_filename() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u53d6\u5f97\u3057\u3001file.save() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001{{ form.field_name }} \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>&lt;form method=\"POST\" enctype=\"multipart\/form-data\"&gt;\n    {{ form.file.label }} {{ form.file() }}\n    {{ form.submit() }}\n&lt;\/form&gt;\n<\/code><\/pre>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3067\u306f\u3001\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u305f\u3081\u306b enctype=&#8221;multipart\/form-data&#8221; \u5c5e\u6027\u3092\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u3001{{ form.file.label }} \u3092\u4f7f\u7528\u3057\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb \u30e9\u30d9\u30eb\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u3001{{ form.file() }} \u3092\u4f7f\u7528\u3057\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u81ea\u4f53\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3068\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-WTF \u304c\u63d0\u4f9b\u3059\u308b\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 \u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u901a\u3058\u3066\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u7c21\u5358\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3001\u691c\u8a3c\u3001\u51e6\u7406\u3067\u304d\u308b\u305f\u3081\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e6\u30fc\u30b6\u30fc \u30a8\u30af\u30b9\u30da\u30ea\u30a8\u30f3\u30b9\u304c\u3088\u308a\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u3067\u30ea\u30c3\u30c1\u306b\u306a\u308a\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u8106\u5f31\u6027\u3084\u60aa\u610f\u306e\u3042\u308b\u653b\u6483\u3092\u56de\u907f\u3059\u308b\u305f\u3081\u306b\u3001\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u5408\u6cd5\u6027\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068Flask-SQLAlchemy\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u57fa\u672c\u6982\u5ff5\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30fc\u30bf\u3068\u60c5\u5831\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b\u4e00\u822c\u7684\u306a\u30c7\u30fc\u30bf\u683c\u7d0d\u65b9\u6cd5\u3067\u3059\u3002Flask \u3067\u306f\u3001Flask-SQLAlchemy \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3001\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3001\u30c7\u30fc\u30bf \u30af\u30a8\u30ea\u306a\u3069\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u7ba1\u7406\u304a\u3088\u3073\u64cd\u4f5c\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 Flask-SQLAlchemy \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u57fa\u672c\u6982\u5ff5\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n<\/ol>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u3001\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3001\u7ba1\u7406\u3001\u304a\u3088\u3073\u7167\u4f1a\u3059\u308b\u305f\u3081\u306e\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2 \u30b7\u30b9\u30c6\u30e0\u3067\u3042\u308a\u3001SQL \u8a00\u8a9e\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u3092\u64cd\u4f5c\u304a\u3088\u3073\u7167\u4f1a\u3067\u304d\u307e\u3059\u3002Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u901a\u5e38\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3001\u8a18\u4e8b\u60c5\u5831\u3001\u30b3\u30e1\u30f3\u30c8\u60c5\u5831\u306a\u3069\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30c7\u30fc\u30bf\u3068\u60c5\u5831\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306b\u306f\u3001MySQL\u3001PostgreSQL\u3001\u304a\u3088\u3073 SQLite \u304c\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Flask-SQLAlchemy \u62e1\u5f35\u6a5f\u80fd<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u306f SQLAlchemy \u306b\u57fa\u3065\u304f Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u306e\u5b9a\u7fa9\u3001\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\u3001\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u306e\u64cd\u4f5c\u306a\u3069\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002Flask-SQLAlchemy \u62e1\u5f35\u6a5f\u80fd\u306f\u3001pip \u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install flask-sqlalchemy\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u3067\u306f\u3001db.Model \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_sqlalchemy import SQLAlchemy\n\ndb = SQLAlchemy()\n\nclass User(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(20), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n\n    def __repr__(self):\n        return '&lt;User %r&gt;' % self.username\n<\/code><\/pre>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3067\u306f\u3001db.Column() \u3092\u4f7f\u7528\u3057\u3066\u3001ID\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u306a\u3069\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5236\u7d04\u3068\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u3001primary_key\u3001unique\u3001nullable \u306a\u3069\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6587\u5b57\u5217\u8868\u73fe\u3092\u8fd4\u3059\u3088\u3046\u306b __repr__() \u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u3067\u306f\u3001db.create_all() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom models import db, User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb.init_app(app)\n\nwith app.app_context():\n    db.create_all()\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u3001db.create_all() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u5b9a\u7fa9\u6e08\u307f\u306e\u3059\u3079\u3066\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>db.session.add() \u304a\u3088\u3073 db.session.commit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u304a\u3088\u3073\u30b3\u30df\u30c3\u30c8\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom models import db, User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb.init_app(app)\n\nwith app.app_context():\n    user = User(username='test', email='test@example.com')\n    db.session.add(user)\n    db.session.commit()\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u3001db.session.add() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3001db.session.commit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>db.session.query() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom models import db, User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb.init_app(app)\n\nwith app.app_context():\n    users = db.session.query(User).all()\n    for user in users:\n        print(user)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001db.session.query() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3057\u3001all() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3059\u3079\u3066\u306e\u30af\u30a8\u30ea\u7d50\u679c\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e0a\u8a18\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068Flask-SQLAlchemy\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u3059<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u6982\u5ff5\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-SQLAlchemy \u304c\u63d0\u4f9b\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u901a\u3058\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u7c21\u5358\u306b\u7ba1\u7406\u304a\u3088\u3073\u64cd\u4f5c\u3067\u304d\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30fc\u30bf \u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u30af\u30a8\u30ea\u304c\u3088\u308a\u4fbf\u5229\u3067\u52b9\u7387\u7684\u306b\u306a\u308a\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30c7\u30fc\u30bf\u6f0f\u6d29\u3084\u4f4e\u901f\u30af\u30a8\u30ea\u306a\u3069\u306e\u554f\u984c\u3092\u56de\u907f\u3059\u308b\u305f\u3081\u306b\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask-SQLAlchemy \u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b Flask-SQLAlchemy \u3092\u4f7f\u7528\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u306b\u306f\u3001\u901a\u5e38\u3001\u6b21\u306e\u624b\u9806\u304c\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u3067\u306f\u3001db.Model \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_sqlalchemy import SQLAlchemy\n\ndb = SQLAlchemy()\n\nclass User(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(20), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n\n    def __repr__(self):\n        return '&lt;User %r&gt;' % self.username\n<\/code><\/pre>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3067\u306f\u3001db.Column() \u3092\u4f7f\u7528\u3057\u3066\u3001ID\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u306a\u3069\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5236\u7d04\u3068\u30d7\u30ed\u30d1\u30c6\u30a3\u306f\u3001primary_key\u3001unique\u3001nullable \u306a\u3069\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6587\u5b57\u5217\u8868\u73fe\u3092\u8fd4\u3059\u3088\u3046\u306b __repr__() \u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u521d\u671f\u5316\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u521d\u671f\u5316\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb = SQLAlchemy(app)\n<\/code><\/pre>\n\n\n\n<p>In the application, use app.config[&#8216;SQLALCHEMY_DATABASE_URI&#8217;] to configure the connection string of the database. \u305f\u3068\u3048\u3070\u3001SQLite \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001sqlite:\/\/\/site.db \u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u6587\u5b57\u5217\u3068\u3057\u3066\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u3001SQLAlchemy \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001db = SQLAlchemy(app) \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u3067\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b db.session \u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom models import User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb = SQLAlchemy(app)\n\n@app.route('\/')\ndef index():\n    user = User.query.filter_by(username='test').first()\n    return f'Hello, {user.username}!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001User.query \u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30af\u30a8\u30ea\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u304c\u300ctest\u300d\u306b\u7b49\u3057\u3044\u6700\u521d\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3057\u3001first() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30af\u30a8\u30ea\u7d50\u679c\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002db.session.add() \u304a\u3088\u3073 db.session.commit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u304a\u3088\u3073\u30b3\u30df\u30c3\u30c8\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom models import User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb = SQLAlchemy(app)\n\n@app.route('\/add')\ndef add_user():\n    user = User(username='test', email='test@example.com')\n    db.session.add(user)\n    db.session.commit()\n    return 'User added successfully!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001User() \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3001db.session.add() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3001db.session.commit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u306f\u3001db.session.delete() \u304a\u3088\u3073 db.session.commit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u524a\u9664\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom models import User\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb = SQLAlchemy(app)\n\n@app.route('\/delete')\ndef delete_user():\n    user = User.query.filter_by(username='test').first()\n    db.session.delete(user)\n    db.session.commit()\n    return 'User deleted successfully!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u3001 User.query.filter_by() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u524a\u9664\u3059\u308b\u30c7\u30fc\u30bf \u30ec\u30b3\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Alembic \u3067\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u64cd\u4f5c\u306b Flask-SQLAlchemy \u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u3068\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u306b\u5f79\u7acb\u3064\u91cd\u8981\u306a\u6982\u5ff5\u3067\u3059\u3002Alembic \u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u3001Flask-SQLAlchemy \u62e1\u5f35\u6a5f\u80fd\u3068\u7d71\u5408\u3067\u304d\u308b\u3001\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b Python \u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002Alembic \u3092\u4f7f\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u306e\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n<\/ol>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c\u3068\u306f\u3001\u5143\u306e\u30c7\u30fc\u30bf\u3092\u7834\u58ca\u3059\u308b\u3053\u3068\u306a\u304f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u69cb\u9020\u307e\u305f\u306f\u30c7\u30fc\u30bf\u3092\u5909\u66f4\u307e\u305f\u306f\u66f4\u65b0\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u3092\u6307\u3057\u307e\u3059\u3002In the Flask application, you can use the Flask-Migrate extension for database migration management. \u57fa\u672c\u7684\u306a\u30d7\u30ed\u30bb\u30b9\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u79fb\u884c\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u521d\u671f\u79fb\u884c\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u306e\u79fb\u884c\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Alembic \u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u57fa\u672c\u6982\u5ff5<\/li>\n<\/ol>\n\n\n\n<p>Alembic \u306f\u3001Flask-SQLAlchemy \u62e1\u5f35\u6a5f\u80fd\u3068\u7d71\u5408\u3067\u304d\u308b Python \u30d9\u30fc\u30b9\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002Alembic \u306f\u3001\u4e00\u9023\u306e\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3 \u30c4\u30fc\u30eb\u3068 Python API \u3092\u63d0\u4f9b\u3057\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u306e\u4f5c\u6210\u3001\u5909\u66f4\u3001\u524a\u9664\u306a\u3069\u306e\u64cd\u4f5c\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Alembic \u30e9\u30a4\u30d6\u30e9\u30ea\u306f pip \u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install alembic\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u79fb\u884c\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u79fb\u884c\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_migrate import Migrate\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/site.db'\ndb = SQLAlchemy(app)\nmigrate = Migrate(app, db)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001 Migrate \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c\u3092\u521d\u671f\u5316\u3057\u307e\u3059 (\u305f\u3068\u3048\u3070\u3001 migrate = Migrate(app, db) \u3092\u4f7f\u7528)\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u521d\u671f\u79fb\u884c\u306e\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Migrate \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u521d\u671f\u79fb\u884c\u3092\u751f\u6210\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>flask db init\n<\/code><\/pre>\n\n\n\n<p>\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001flask db init \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u521d\u671f\u79fb\u884c\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u7de8\u96c6<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Migrate \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u751f\u6210\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>flask db migrate -m \"create user table\"\n<\/code><\/pre>\n\n\n\n<p>\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001flask db migrate \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u751f\u6210\u3057\u3001-m \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u79fb\u884c\u306e\u8aac\u660e\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u6b21\u306e\u3088\u3046\u306b\u7de8\u96c6\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from alembic import op\nimport sqlalchemy as sa\n\ndef upgrade():\n    op.create_table('user',\n        sa.Column('id', sa.Integer(), nullable=False),\n        sa.Column('username', sa.String(length=20), nullable=False),\n        sa.Column('email', sa.String(length=120), nullable=False),\n        sa.PrimaryKeyConstraint('id')\n    )\n\ndef downgrade():\n    op.drop_table('user')\n<\/code><\/pre>\n\n\n\n<p>\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u306f\u3001alembic.op \u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u300cuser\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u3001id\u3001username\u3001email \u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002op.drop_table \u3092\u4f7f\u7528\u3067\u304d\u307e\u3059<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u524a\u9664\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u3002\u305f\u3068\u3048\u3070\u3001&#8217;user&#8217; \u3068\u3044\u3046\u540d\u524d\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u79fb\u884c<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Migrate \u62e1\u5f35\u6a5f\u80fd\u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u79fb\u884c\u3092\u9069\u7528\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>flask db upgrade\n<\/code><\/pre>\n\n\n\n<p>\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001flask db upgrade \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u79fb\u884c\u3092\u9069\u7528\u3057\u307e\u3059\u3002\u79fb\u884c\u304c\u9069\u7528\u3055\u308c\u308b\u3068\u3001\u5bfe\u5fdc\u3059\u308b\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u307e\u305f\u306f\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u4f5c\u6210\u307e\u305f\u306f\u66f4\u65b0\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\">\n<li>Alembic \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u305f\u9ad8\u5ea6\u306a\u79fb\u884c<\/li>\n<\/ol>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u79fb\u884c\u64cd\u4f5c\u306b\u52a0\u3048\u3066\u3001Alembic \u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u9ad8\u5ea6\u306a\u79fb\u884c\u64cd\u4f5c\u3082\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u306e\u30d5\u30a3\u30fc\u30eb\u30c9 \u30bf\u30a4\u30d7\u307e\u305f\u306f\u5236\u7d04\u3092\u5909\u66f4\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3001\u4e00\u610f\u306e\u5236\u7d04\u3001\u307e\u305f\u306f\u5916\u90e8\u30ad\u30fc\u306a\u3069\u3092\u4f5c\u6210\u307e\u305f\u306f\u524a\u9664\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u79fb\u884c\u64cd\u4f5c\u306a\u3069\u3092\u7d44\u307f\u5408\u308f\u305b\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u79fb\u884c\u64cd\u4f5c\u306f\u3001\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u3067\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3067 alembic.op.drop_constraint() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u306e\u5236\u7d04\u3092\u524a\u9664\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from alembic import op\n\ndef upgrade():\n    op.drop_constraint('user_username_key', 'user', type_='unique')\n\ndef downgrade():\n    op.create_unique_constraint('user_username_key', 'user', ['username'])\n<\/code><\/pre>\n\n\n\n<p>\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u3001alembic.op.drop_constraint() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u300cuser_username_key\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30c7\u30fc\u30bf \u30c6\u30fc\u30d6\u30eb\u306e\u4e00\u610f\u306e\u5236\u7d04\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u7279\u306b\u672c\u756a\u74b0\u5883\u3067\u306f\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002\u30c7\u30fc\u30bf\u306e\u640d\u5931\u3068\u5143\u306b\u623b\u305b\u306a\u3044\u5909\u66f4\u3092\u56de\u907f\u3059\u308b\u305f\u3081\u306b\u3001\u79fb\u884c\u64cd\u4f5c\u306b\u306f\u30c6\u30b9\u30c8 \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3057\u3001\u30c6\u30b9\u30c8\u306b\u5408\u683c\u3057\u305f\u3089\u672c\u756a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u9069\u7528\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u4f55\u304b\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u5834\u5408\u306b\u30c7\u30fc\u30bf\u3068\u79fb\u884c\u5c65\u6b74\u3092\u5fa9\u5143\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30c7\u30fc\u30bf\u3068\u79fb\u884c\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u9078\u629e\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u3001\u73fe\u5728\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b 2 \u3064\u306e\u30bf\u30a4\u30d7\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u306b\u9577\u6240\u3068\u77ed\u6240\u304c\u3042\u308a\u3001\u7279\u5b9a\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30bf\u30a4\u30d7\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u3001\u30c7\u30fc\u30bf\u3092\u30c6\u30fc\u30d6\u30eb\u5f62\u5f0f\u3067\u683c\u7d0d\u3059\u308b\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30e2\u30c7\u30eb\u306b\u57fa\u3065\u304f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u3042\u308a\u3001\u4e3b\u30ad\u30fc\u3068\u5916\u90e8\u30ad\u30fc\u306a\u3069\u3001\u30c7\u30fc\u30bf\u9593\u306b\u53b3\u5bc6\u306a\u95a2\u4fc2\u5236\u7d04\u304c\u3042\u308a\u307e\u3059\u3002\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u306f\u3001\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3001\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406\u3001\u304a\u3088\u3073\u30af\u30a8\u30ea\u6a5f\u80fd\u3068\u3044\u3046\u5229\u70b9\u304c\u3042\u308a\u3001\u91d1\u878d\u200b\u200b\u3084\u96fb\u5b50\u5546\u53d6\u5f15\u306a\u3069\u3001\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3068\u6574\u5408\u6027\u304c\u5fc5\u8981\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u3001\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3001\u30ad\u30fc\u3068\u5024\u306e\u30da\u30a2\u3001\u30b0\u30e9\u30d5\u306a\u3069\u3001\u3055\u307e\u3056\u307e\u306a\u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u683c\u7d0d\u3059\u308b\u975e\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6307\u3057\u307e\u3059\u3002NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u306f\u3001\u9ad8\u3044\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3001\u9ad8\u6027\u80fd\u3001\u304a\u3088\u3073\u67d4\u8edf\u6027\u3068\u3044\u3046\u5229\u70b9\u304c\u3042\u308a\u3001\u30bd\u30fc\u30b7\u30e3\u30eb \u30e1\u30c7\u30a3\u30a2\u3084\u30e2\u30ce\u306e\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306a\u3069\u3001\u5927\u898f\u6a21\u306a\u30c7\u30fc\u30bf \u30b9\u30c8\u30ec\u30fc\u30b8\u3084\u540c\u6642\u30a2\u30af\u30bb\u30b9\u306e\u591a\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u3069\u3061\u3089\u304b\u3092\u9078\u629e\u3059\u308b\u3068\u304d\u306f\u3001\u6b21\u306e\u8981\u56e0\u3092\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u69cb\u9020\u3068\u8907\u96d1\u3055<\/li>\n<\/ol>\n\n\n\n<p>\u8868\u5f62\u5f0f\u306e\u30c7\u30fc\u30bf\u3084\u5358\u7d14\u306a\u30ad\u30fc\u3068\u5024\u306e\u30da\u30a2\u306a\u3069\u3001\u30c7\u30fc\u30bf\u69cb\u9020\u3068\u8907\u96d1\u3055\u304c\u6bd4\u8f03\u7684\u5358\u7d14\u306a\u5834\u5408\u306f\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308b\u65b9\u304c\u9069\u5207\u3067\u3059\u3002\u30c7\u30fc\u30bf\u69cb\u9020\u304c\u8907\u96d1\u3067\u3042\u308b\u304b\u3001\u30c7\u30fc\u30bf\u9593\u306e\u95a2\u4fc2\u304c\u6bd4\u8f03\u7684\u30e9\u30f3\u30c0\u30e0\u3067\u3042\u308b\u5834\u5408\u306f\u3001NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308b\u65b9\u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30c7\u30fc\u30bf\u91cf\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u8981\u4ef6<\/li>\n<\/ol>\n\n\n\n<p>\u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u3001\u30c7\u30fc\u30bf\u3092\u3059\u3070\u3084\u304f\u30af\u30a8\u30ea\u3001\u66f4\u65b0\u3001\u304a\u3088\u3073\u51e6\u7406\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308b\u65b9\u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002\u30c7\u30fc\u30bf\u91cf\u304c\u5c11\u306a\u3044\u5834\u5408\u3001\u307e\u305f\u306f\u30af\u30a8\u30ea\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8981\u4ef6\u304c\u9ad8\u304f\u306a\u3044\u5834\u5408\u306f\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3068\u6574\u5408\u6027\u306e\u8981\u4ef6<\/li>\n<\/ol>\n\n\n\n<p>\u91d1\u878d\u3001\u96fb\u5b50\u5546\u53d6\u5f15\u306a\u3069\u3001\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3068\u6574\u5408\u6027\u3092\u78ba\u4fdd\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f7f\u7528\u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3068\u5b8c\u5168\u6027\u306e\u8981\u4ef6\u304c\u9ad8\u304f\u306a\u3044\u5834\u5408\u3001\u307e\u305f\u306f\u30bd\u30fc\u30b7\u30e3\u30eb \u30e1\u30c7\u30a3\u30a2\u3084\u30e2\u30ce\u306e\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306a\u3069\u306e\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0 \u30b7\u30ca\u30ea\u30aa\u304c\u9ad8\u3044\u5834\u5408\u306f\u3001NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f7f\u7528\u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30c7\u30fc\u30bf\u5206\u6790\u3068\u7d71\u8a08\u306e\u5fc5\u8981\u6027<\/li>\n<\/ol>\n\n\n\n<p>\u30d3\u30c3\u30b0\u30c7\u30fc\u30bf\u3084\u30c7\u30fc\u30bf\u30de\u30a4\u30cb\u30f3\u30b0\u306a\u3069\u306e\u30c7\u30fc\u30bf\u5206\u6790\u3084\u7d71\u8a08\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f7f\u7528\u304c\u9069\u3057\u3066\u3044\u307e\u3059\u3002\u5358\u7d14\u306a\u30c7\u30fc\u30bf \u30af\u30a8\u30ea\u3092\u5b9f\u884c\u3057\u3066\u7d71\u8a08\u3092\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u3060\u3051\u3067\u3088\u3044\u5834\u5408\u306f\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068 NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u306f\u305d\u308c\u305e\u308c\u9577\u6240\u3068\u77ed\u6240\u304c\u3042\u308a\u3001\u7279\u5b9a\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b7\u30ca\u30ea\u30aa\u306b\u5f93\u3063\u3066\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u9078\u629e\u3059\u308b\u969b\u306b\u306f\u3001\u30c7\u30fc\u30bf\u306e\u4fe1\u983c\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u30c7\u30fc\u30bf\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u30c7\u30fc\u30bf\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u30ea\u30ab\u30d0\u30ea\u306a\u3069\u306e\u554f\u984c\u3082\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask-Login \u3092\u4f7f\u7528\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3092\u51e6\u7406\u3057\u307e\u3059<\/p>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u306f\u3001\u30e6\u30fc\u30b6\u30fc \u30a2\u30af\u30bb\u30b9\u6a29\u3092\u5236\u5fa1\u3057\u3001\u6a5f\u5bc6\u30c7\u30fc\u30bf\u3092\u4fdd\u8b77\u3059\u308b\u305f\u3081\u306e Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4e00\u822c\u7684\u306a\u6a5f\u80fd\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002Flask-Login \u3067\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3092\u51e6\u7406\u3059\u308b\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u30ed\u30b0\u30a4\u30f3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Flask-Login \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install Flask-Login\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30e6\u30fc\u30b6\u30fc \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_login import UserMixin\nfrom yourapp import db\n\nclass User(UserMixin, db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(20), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password = db.Column(db.String(60), nullable=False)\n<\/code><\/pre>\n\n\n\n<p>User \u30e2\u30c7\u30eb\u3067\u306f\u3001flask_login.UserMixin \u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3001id\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u8a8d\u8a3c\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u8a8d\u8a3c\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u3092\u5b9f\u88c5\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u78ba\u8a8d\u3057\u3001\u30e6\u30fc\u30b6\u30fc \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8fd4\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from yourapp.models import User\n\n@login_manager.user_loader\ndef load_user(user_id):\n    return User.query.get(int(user_id))\n\n@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    if current_user.is_authenticated:\n        return redirect(url_for('index'))\n    form = LoginForm()\n    if form.validate_on_submit():\n        user = User.query.filter_by(email=form.email.data).first()\n        if user and bcrypt.check_password_hash(user.password, form.password.data):\n            login_user(user, remember=form.remember.data)\n            next_page = request.args.get('next')\n            return redirect(next_page) if next_page else redirect(url_for('index'))\n        else:\n            flash('Login Unsuccessful. Please check email and password', 'danger')\n    return render_template('login.html', title='Login', form=form)\n<\/code><\/pre>\n\n\n\n<p>\u8a8d\u8a3c\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304b\u3089\u63d0\u4f9b\u3055\u308c\u305f\u60c5\u5831\u306b\u5f93\u3063\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u78ba\u8a8d\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u8fd4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u691c\u8a3c\u306b\u6210\u529f\u3059\u308b\u3068\u3001login_user() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30b0\u30a4\u30f3\u72b6\u614b\u3092\u8a8d\u8a3c\u6e08\u307f\u306b\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30ed\u30b0\u30a4\u30f3 \u30d3\u30e5\u30fc\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u8a8d\u8a3c\u8981\u6c42\u3092\u53d7\u3051\u53d6\u308b\u305f\u3081\u306b\u30ed\u30b0\u30a4\u30f3 \u30d3\u30e5\u30fc\u3092\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/login', methods=['GET', 'POST'])\ndef login():\n    if current_user.is_authenticated:\n        return redirect(url_for('index'))\n    form = LoginForm()\n    if form.validate_on_submit():\n        user = User.query.filter_by(email=form.email.data).first()\n        if user and bcrypt.check_password_hash(user.password, form.password.data):\n            login_user(user, remember=form.remember.data)\n            next_page = request.args.get('next')\n            return redirect(next_page) if next_page else redirect(url_for('index'))\n        else:\n            flash('Login Unsuccessful. Please check email and password', 'danger')\n    return render_template('login.html', title='Login', form=form)\n<\/code><\/pre>\n\n\n\n<p>\u30ed\u30b0\u30a4\u30f3 \u30d3\u30e5\u30fc\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304b\u3089\u63d0\u4f9b\u3055\u308c\u305f\u60c5\u5831\u3092\u691c\u8a3c\u3059\u308b\u3053\u3068\u3067\u8a8d\u8a3c\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002\u8a8d\u8a3c\u304c\u6210\u529f\u3057\u305f\u5834\u5408\u306f\u3001login_user() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30b0\u30a4\u30f3 \u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u8a8d\u8a3c\u6e08\u307f\u306b\u8a2d\u5b9a\u3057\u3001\u6307\u5b9a\u3055\u308c\u305f\u30da\u30fc\u30b8\u306b\u30e6\u30fc\u30b6\u30fc\u3092\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u9054\u6210<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u30ed\u30b0\u30a2\u30a6\u30c8 \u30d3\u30e5\u30fc\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30ed\u30b0\u30a2\u30a6\u30c8 \u30d3\u30e5\u30fc\u3092\u5b9f\u88c5\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u8a8d\u8a3c\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u30ed\u30b0\u30a2\u30a6\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/logout')\n@login_required\ndef logout():\n    logout_user()\n    return redirect(url_for('index'))\n<\/code><\/pre>\n\n\n\n<p>\u30ed\u30b0\u30a2\u30a6\u30c8 \u30d3\u30e5\u30fc\u3067\u306f\u3001logout_user() \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u8a8d\u8a3c\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u672a\u8a8d\u8a3c\u306b\u8a2d\u5b9a\u3057\u3001\u6307\u5b9a\u3057\u305f\u30da\u30fc\u30b8\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001 @login_required \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30af\u30bb\u30b9\u306b\u8a8d\u8a3c\u304c\u5fc5\u8981\u306a\u30d3\u30e5\u30fc\u3092\u4fdd\u8b77\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@app.route('\/profile')\n@login_required\ndef profile():\n    return render_template('profile.html', title='Profile')\n<\/code><\/pre>\n\n\n\n<p>\u8a8d\u8a3c\u304c\u5fc5\u8981\u306a\u30d3\u30e5\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u969b\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3001\u81ea\u52d5\u7684\u306b\u30ed\u30b0\u30a4\u30f3 \u30da\u30fc\u30b8\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\">\n<li>\u30ed\u30fc\u30eb\u6a29\u9650\u5236\u5fa1\u3092\u5b9f\u73fe<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30ed\u30fc\u30eb\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u5236\u5fa1\u3092\u4f7f\u7528\u3057\u3066\u3001\u3088\u308a\u304d\u3081\u7d30\u304b\u3044\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30ed\u30fc\u30eb \u30d5\u30a3\u30fc\u30eb\u30c9\u3092 User \u30e2\u30c7\u30eb\u306b\u8ffd\u52a0\u3057\u3001\u30d3\u30e5\u30fc\u3067 @role_required \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30af\u30bb\u30b9\u306b\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u304c\u5fc5\u8981\u306a\u30d3\u30e5\u30fc\u3092\u4fdd\u8b77\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from functools import wraps\nfrom flask import abort\nfrom flask_login import current_user\n\ndef role_required(role):\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            if not current_user.is_authenticated or current_user.role != role:\n                abort(403)\n            return func(*args, **kwargs)\n        return wrapper\n    return decorator\n\n@app.route('\/admin')\n@role_required('admin')\ndef admin():\n    return render_template('admin.html', title='Admin')\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30af\u30bb\u30b9\u306b\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u304c\u5fc5\u8981\u306a\u30d3\u30e5\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u5834\u5408\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30fc\u30eb\u304c\u4e00\u81f4\u3057\u306a\u3044\u5834\u5408\u3001403 Forbidden \u30a8\u30e9\u30fc\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4fdd\u8b77\u3084\u60aa\u610f\u306e\u3042\u308b\u653b\u6483\u306e\u9632\u6b62\u306a\u3069\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u554f\u984c\u306b\u3082\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406\u306e\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u306e\u5b9f\u88c5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u304a\u3051\u308b\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u6a5f\u80fd\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u304a\u3088\u3073 Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u306e\u8a73\u7d30\u306a\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-Login \u304a\u3088\u3073 Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Flask-Login \u304a\u3088\u3073 Flask-WTF \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install Flask-Login Flask-WTF\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306b User \u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from yourapp import db, login_manager\nfrom flask_login import UserMixin\n\nclass User(UserMixin, db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(20), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password = db.Column(db.String(60), nullable=False)\n<\/code><\/pre>\n\n\n\n<p>User \u30e2\u30c7\u30eb\u3067\u306f\u3001flask_login.UserMixin \u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3001id\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_wtf import FlaskForm\nfrom wtforms import StringField, PasswordField, SubmitField\nfrom wtforms.validators import DataRequired, Email, EqualTo, Length\n\nclass RegistrationForm(FlaskForm):\n    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])\n    email = StringField('Email', validators=[DataRequired(), Email()])\n    password = PasswordField('Password', validators=[DataRequired()])\n    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])\n    submit = SubmitField('Sign Up')\n<\/code><\/pre>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u30d5\u30a9\u30fc\u30e0\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u96fb\u5b50\u30e1\u30fc\u30eb \u30a2\u30c9\u30ec\u30b9\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u78ba\u8a8d\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u30d0\u30ea\u30c7\u30fc\u30bf\u3092\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30e6\u30fc\u30b6\u30fc\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc \u30ed\u30b0\u30a4\u30f3 \u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_wtf import FlaskForm\nfrom wtforms import StringField, PasswordField, BooleanField, SubmitField\nfrom wtforms.validators import DataRequired, Email, Length\n\nclass LoginForm(FlaskForm):\n    email = StringField('Email', validators=[DataRequired(), Email()])\n    password = PasswordField('Password', validators=[DataRequired()])\n    remember = BooleanField('Remember Me')\n    submit = SubmitField('Login')\n<\/code><\/pre>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc \u30ed\u30b0\u30a4\u30f3 \u30d5\u30a9\u30fc\u30e0\u3067\u306f\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u8a18\u61b6\u3059\u308b\u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u767b\u9332\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u8981\u6c42\u3092\u51e6\u7406\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import render_template, flash, redirect, url_for\nfrom yourapp import app, db, bcrypt\nfrom yourapp.forms import RegistrationForm\nfrom yourapp.models import User\n\n@app.route('\/register', methods=['GET', 'POST'])\ndef register():\n    form = RegistrationForm()\n    if form.validate_on_submit():\n        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')\n        user = User(username=form.username.data, email=form.email.data, password=hashed_password)\n        db.session.add(user)\n        db.session.commit()\n        flash('Your account has been created! You are now able to log in', 'success')\n        return redirect(url_for('login'))\n    return render_template('register.html\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406\u4fdd\u8b77\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u6a29\u5229\u7ba1\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u4fdd\u8b77\u3068\u6a29\u9650\u7ba1\u7406\u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u4e00\u822c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5236\u5fa1\u6a5f\u80fd\u3067\u3042\u308a\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u7279\u5b9a\u306e\u30da\u30fc\u30b8\u3084\u64cd\u4f5c\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306e\u3092\u5236\u9650\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u62e1\u5f35\u6a5f\u80fd\u3068\u30ab\u30b9\u30bf\u30e0 \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u3001\u4fdd\u8b77\u3055\u308c\u305f\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u6a29\u9650\u7ba1\u7406\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u6a29\u9650\u7ba1\u7406\u3092\u4fdd\u8b77\u3059\u308b\u305f\u3081\u306e\u8a73\u7d30\u306a\u624b\u9806\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-Login \u3067\u30eb\u30fc\u30c8\u3092\u4fdd\u8b77\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u306e @login_required \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30af\u30bb\u30b9\u306b\u8a8d\u8a3c\u304c\u5fc5\u8981\u306a\u30eb\u30fc\u30c8\u3092\u4fdd\u8b77\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_login import login_required\n\n@app.route('\/profile')\n@login_required\ndef profile():\n    return render_template('profile.html')\n<\/code><\/pre>\n\n\n\n<p>\u8a8d\u8a3c\u304c\u5fc5\u8981\u306a\u30eb\u30fc\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u969b\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3001\u81ea\u52d5\u7684\u306b\u30ed\u30b0\u30a4\u30f3 \u30da\u30fc\u30b8\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30ab\u30b9\u30bf\u30e0 \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30ab\u30b9\u30bf\u30e0 \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u3001\u3088\u308a\u304d\u3081\u7d30\u304b\u3044\u6a29\u9650\u7ba1\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001 @role_required \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u5b9a\u7fa9\u3057\u3066\u3001\u30eb\u30fc\u30c8\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u3092\u6301\u3064\u30e6\u30fc\u30b6\u30fc\u306e\u307f\u306b\u5236\u9650\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from functools import wraps\nfrom flask import abort\nfrom flask_login import current_user\n\ndef role_required(role):\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            if not current_user.is_authenticated or current_user.role != role:\n                abort(403)\n            return func(*args, **kwargs)\n        return wrapper\n    return decorator\n\n@app.route('\/admin')\n@role_required('admin')\ndef admin():\n    return render_template('admin.html')\n<\/code><\/pre>\n\n\n\n<p>\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u304c\u5fc5\u8981\u306a\u30eb\u30fc\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u5834\u5408\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30fc\u30eb\u304c\u4e00\u81f4\u3057\u306a\u3044\u5834\u5408\u3001403 Forbidden \u30a8\u30e9\u30fc\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u3092\u5236\u5fa1\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5185\u306e if \u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3068\u3001Flask-Login \u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b current_user \u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30af\u30bb\u30b9\u3092\u5236\u5fa1\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">html\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>{% if current_user.is_authenticated %}\n    &lt;p&gt;Welcome {{ current_user.username }}!&lt;\/p&gt;\n{% else %}\n    &lt;p&gt;Please &lt;a href=\"{{ url_for('login') }}\"&gt;log in&lt;\/a&gt; to access this page.&lt;\/p&gt;\n{% endif %}\n<\/code><\/pre>\n\n\n\n<p>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u3001if \u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u3001\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306f\u30a6\u30a7\u30eb\u30ab\u30e0 \u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3057\u3001\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u30ed\u30b0\u30a4\u30f3 \u30ea\u30f3\u30af\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-Login \u3068\u30ab\u30b9\u30bf\u30e0 \u30c7\u30b3\u30ec\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u3001\u4fdd\u8b77\u3055\u308c\u305f\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u6a29\u9650\u7ba1\u7406\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4fdd\u8b77\u3084\u60aa\u610f\u306e\u3042\u308b\u653b\u6483\u306e\u9632\u6b62\u306a\u3069\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u554f\u984c\u306b\u3082\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask-User \u3092\u4f7f\u7528\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u3092\u7c21\u7d20\u5316\u3057\u307e\u3059<\/p>\n\n\n\n<p>Flask-User \u306f\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3001\u30ed\u30b0\u30a4\u30f3\u3001\u8a8d\u8a3c\u3001\u627f\u8a8d\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30ea\u30bb\u30c3\u30c8\u306a\u3069\u3001\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u3092\u7c21\u7d20\u5316\u3059\u308b Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002Flask-User \u3092\u4f7f\u7528\u3057\u3066\u3001\u5b89\u5168\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3059\u3070\u3084\u304f\u69cb\u7bc9\u3057\u3001\u958b\u767a\u6642\u9593\u3068\u8907\u96d1\u3055\u3092\u5927\u5e45\u306b\u524a\u6e1b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask-User \u3092\u4f7f\u7528\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u3092\u7c21\u7d20\u5316\u3059\u308b\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install Flask-User\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u69cb\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u69cb\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_user import UserManager, UserMixin\n\n# \u5728Flask\u5e94\u7528\u7a0b\u5e8f\u4e2d\u914d\u7f6eFlask-User\u6269\u5c55\napp.config['SECRET_KEY'] = 'this-is-a-secret-key'\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/users.db'\napp.config['USER_ENABLE_EMAIL'] = False\napp.config['USER_ENABLE_USERNAME'] = True\napp.config['USER_APP_NAME'] = 'My App'\napp.config['USER_AFTER_REGISTER_ENDPOINT'] = 'login'\napp.config['USER_AFTER_LOGIN_ENDPOINT'] = 'profile'\napp.config['USER_AFTER_LOGOUT_ENDPOINT'] = 'index'\ndb.init_app(app)\nuser_manager = UserManager(app, db, UserMixin)\n<\/code><\/pre>\n\n\n\n<p>Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u69cb\u6210\u3059\u308b\u3068\u304d\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 URI\u3001\u96fb\u5b50\u30e1\u30fc\u30eb\u8a8d\u8a3c\u3092\u6709\u52b9\u306b\u3059\u308b\u304b\u3069\u3046\u304b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u540d\u3001\u767b\u9332\u5f8c\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u308b\u30da\u30fc\u30b8\u306a\u3069\u3001\u3044\u304f\u3064\u304b\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u521d\u671f\u5316\u3057\u3001UserMixin \u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u3066\u30e6\u30fc\u30b6\u30fc \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u3082\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30e6\u30fc\u30b6\u30fc \u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001UserMixin \u30af\u30e9\u30b9\u3092\u7d99\u627f\u3059\u308b User \u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from yourapp import db, login_manager\nfrom flask_login import UserMixin\n\nclass User(UserMixin, db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(20), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password = db.Column(db.String(60), nullable=False)\n    active = db.Column(db.Boolean(), nullable=False, default=False)\n    confirmed_at = db.Column(db.DateTime())\n<\/code><\/pre>\n\n\n\n<p>User \u30e2\u30c7\u30eb\u3067\u306f\u3001id\u3001username\u3001email\u3001password \u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u30a2\u30af\u30c6\u30a3\u30d6\u5316\u3055\u308c\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u793a\u3057\u3001\u767b\u9332\u6642\u9593\u306a\u3069\u306e\u60c5\u5831\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b active \u304a\u3088\u3073 Confirmed_at \u306a\u3069\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 .<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30e6\u30fc\u30b6\u30fc\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-User \u304c\u63d0\u4f9b\u3059\u308b\u8a2d\u8a08\u56f3\u3068\u8868\u793a\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_user import login_required, roles_required, UserManager\n\nuser_manager = UserManager(app, db, User)\n\n@app.route('\/profile')\n@login_required\ndef profile():\n    return render_template('profile.html')\n\n@app.route('\/admin')\n@roles_required('admin')\ndef admin():\n    return render_template('admin.html')\n<\/code><\/pre>\n\n\n\n<p>\u30d3\u30e5\u30fc\u95a2\u6570\u3067\u306f\u3001 @login_required \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u7279\u5b9a\u306e\u30da\u30fc\u30b8\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u8a8d\u8a3c\u6e08\u307f\u30e6\u30fc\u30b6\u30fc\u306e\u307f\u306b\u5236\u9650\u3057\u305f\u308a\u3001 @roles_required \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u7279\u5b9a\u306e\u30da\u30fc\u30b8\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u7279\u5b9a\u306e\u30ed\u30fc\u30eb\u3092\u6301\u3064\u30e6\u30fc\u30b6\u30fc\u306e\u307f\u306b\u5236\u9650\u3057\u305f\u308a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-User \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406\u6a5f\u80fd\u306e\u5b9f\u88c5\u3092\u7c21\u7d20\u5316\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u540c\u6642\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u4fdd\u8b77\u3001\u5f37\u529b\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u4f7f\u7528\u3001\u6a5f\u5bc6\u60c5\u5831\u306e\u6697\u53f7\u5316\u3001SQL \u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u3084 XSS \u653b\u6483\u306e\u9632\u6b62\u306a\u3069\u306e\u60aa\u610f\u306e\u3042\u308b\u653b\u6483\u306e\u9632\u6b62\u306a\u3069\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u554f\u984c\u306b\u3082\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3055\u3089\u306b\u3001\u30e6\u30fc\u30b6\u30fc \u30a8\u30af\u30b9\u30da\u30ea\u30a8\u30f3\u30b9\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u4fe1\u983c\u6027\u3092\u30c6\u30b9\u30c8\u3057\u3066\u6700\u9069\u5316\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>RESTful API\u306e\u57fa\u672c\u7684\u306a\u8003\u3048\u65b9\u3092\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>RESTful API \u306f Web API \u8a2d\u8a08\u30b9\u30bf\u30a4\u30eb\u3067\u3042\u308a\u3001Web \u30b5\u30fc\u30d3\u30b9 \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u5b9a\u7fa9\u3057\u3001\u30c7\u30fc\u30bf\u3068\u64cd\u4f5c\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3068\u7ba1\u7406\u3092\u63d0\u4f9b\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002REST\u3068\u306fRepresentational State Transfer\u306e\u7565\u3067\u3001\u300c\u30d7\u30ec\u30bc\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u5c64\u306e\u72b6\u614b\u9077\u79fb\u300d\u3092\u610f\u5473\u3057\u3001HTTP\u30d7\u30ed\u30c8\u30b3\u30eb\u306b\u57fa\u3065\u304f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8a2d\u8a08\u30b9\u30bf\u30a4\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<p>RESTful API \u306e\u57fa\u672c\u6982\u5ff5\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9<\/li>\n<\/ol>\n\n\n\n<p>RESTful API \u306e\u30ea\u30bd\u30fc\u30b9\u3068\u306f\u3001\u64cd\u4f5c\u304c\u5fc5\u8981\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u307e\u305f\u306f\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u3092\u6307\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u3001\u8a18\u4e8b\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u6ce8\u6587\u306a\u3069\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5185\u306e\u3042\u3089\u3086\u308b\u3082\u306e\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u8868\u793a<\/li>\n<\/ol>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u8868\u73fe\u3068\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u304c Web API \u3067\u8868\u793a\u3055\u308c\u308b\u65b9\u6cd5\u3092\u6307\u3057\u3001XML\u3001JSON\u3001HTML\u3001\u307e\u305f\u306f\u30ab\u30b9\u30bf\u30e0\u5f62\u5f0f\u306a\u3069\u306e\u5f62\u5f0f\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30bf\u30a4\u30d7<\/li>\n<\/ol>\n\n\n\n<p>\u5404\u30ea\u30bd\u30fc\u30b9\u306b\u306f\u3001Web API \u3067\u4e00\u610f\u306e URI (Uniform Resource Identifier) \u304c\u5fc5\u8981\u3067\u3059\u3002\u3053\u308c\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u306e\u5834\u6240\u3068\u30a2\u30af\u30bb\u30b9\u65b9\u6cd5\u3092\u8b58\u5225\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>HTTP\u65b9\u6cd5<\/li>\n<\/ol>\n\n\n\n<p>GET (\u30ea\u30bd\u30fc\u30b9\u306e\u53d6\u5f97)\u3001POST (\u30ea\u30bd\u30fc\u30b9\u306e\u4f5c\u6210)\u3001PUT (\u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0)\u3001DELETE (\u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664) \u306a\u3069\u3001\u30ea\u30bd\u30fc\u30b9\u306b\u5bfe\u3057\u3066\u3055\u307e\u3056\u307e\u306a\u64cd\u4f5c\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b\u3001\u4e00\u9023\u306e HTTP \u30e1\u30bd\u30c3\u30c9\u304c RESTful API \u3067\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9<\/li>\n<\/ol>\n\n\n\n<p>200 OK (\u6210\u529f)\u3001201 Created (\u6210\u529f\u3057\u305f\u4f5c\u6210)\u3001404 Not Found (\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u3089\u306a\u3044)\u3001\u304a\u3088\u3073 500 Internal Server Error (\u5185\u90e8\u30b5\u30fc\u30d0\u30fc\u30a8\u30e9\u30fc) \u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>RESTful API \u3092\u4f7f\u7528\u3059\u308b\u3068\u3001Web \u30b5\u30fc\u30d3\u30b9\u306e\u8fc5\u901f\u306a\u958b\u767a\u3068\u7d71\u5408\u3092\u5b9f\u73fe\u3057\u3001\u67d4\u8edf\u3067\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u3067\u4fe1\u983c\u6027\u304c\u9ad8\u304f\u3001\u5b89\u5168\u3067\u4fdd\u5b88\u53ef\u80fd\u306a API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u63d0\u4f9b\u3067\u304d\u307e\u3059\u3002\u540c\u6642\u306b\u3001API \u306e\u53ef\u7528\u6027\u3068\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001API \u8a2d\u8a08\u306e\u5408\u7406\u6027\u3001\u30c7\u30fc\u30bf \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u304a\u3088\u3073\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306a\u3069\u306e\u554f\u984c\u3092\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask-RESTful\u3067\u306eAPI\u4f5c\u6210\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u6559\u3048\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Flask-RESTful \u306f\u3001Web API \u306e\u958b\u767a\u3068\u7ba1\u7406\u3092\u7c21\u7d20\u5316\u3059\u308b\u305f\u3081\u306e Flask \u30d9\u30fc\u30b9\u306e RESTful \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3059\u3002Flask-RESTful \u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30c7\u30fc\u30bf\u3068\u64cd\u4f5c\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3068\u7ba1\u7406\u3092\u63d0\u4f9b\u3059\u308b RESTful API \u3092\u7c21\u5358\u306b\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask-RESTful \u3092\u4f7f\u7528\u3057\u3066 API \u3092\u4f5c\u6210\u3059\u308b\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-RESTful \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Flask-RESTful \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install Flask-RESTful\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>API \u30ea\u30bd\u30fc\u30b9\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001API \u30ea\u30bd\u30fc\u30b9 \u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u3001Flask-RESTful \u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b Resource \u30af\u30e9\u30b9\u304b\u3089\u7d99\u627f\u3057\u3001\u5bfe\u5fdc\u3059\u308b HTTP \u30e1\u30bd\u30c3\u30c9\u3068\u64cd\u4f5c\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_restful import Resource, Api\n\napi = Api(app)\n\nclass User(Resource):\n    def get(self, id):\n        # \u83b7\u53d6\u7528\u6237\u4fe1\u606f\n        pass\n\n    def post(self):\n        # \u521b\u5efa\u65b0\u7528\u6237\n        pass\n\n    def put(self, id):\n        # \u66f4\u65b0\u7528\u6237\u4fe1\u606f\n        pass\n\n    def delete(self, id):\n        # \u5220\u9664\u7528\u6237\n        pass\n\napi.add_resource(User, '\/users', '\/users\/&lt;int:id&gt;')\n<\/code><\/pre>\n\n\n\n<p>API \u30ea\u30bd\u30fc\u30b9 \u30af\u30e9\u30b9\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u53d6\u5f97\u3001\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\u3001\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u66f4\u65b0\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664\u306a\u3069\u3001\u5bfe\u5fdc\u3059\u308b HTTP \u30e1\u30bd\u30c3\u30c9\u3068\u64cd\u4f5c\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30af\u30e9\u30b9\u5b9a\u7fa9\u3067 add_resource \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066 API \u30ea\u30bd\u30fc\u30b9 \u30af\u30e9\u30b9\u3092 Flask-RESTful \u306b\u767b\u9332\u3057\u3001\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3068 URI \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001run \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u59cb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>if __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5\u6642\u306b\u3001\u30c7\u30d0\u30c3\u30b0\u3068\u958b\u767a\u306e\u305f\u3081\u306b\u30c7\u30d0\u30c3\u30b0 \u30d1\u30e9\u30e1\u30fc\u30bf\u3092 True \u306b\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u30c6\u30b9\u30c8<\/li>\n<\/ol>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u30fc\u307e\u305f\u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067\u306f\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001HTTP \u30e1\u30bd\u30c3\u30c9\u3068 URI \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u5bfe\u5fdc\u3059\u308b\u64cd\u4f5c\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">http\u30b3\u30d4\u30fc\u30b3\u30fc\u30c9<code>GET \/users\/1 HTTP\/1.1\nHost: example.com\n<\/code><\/pre>\n\n\n\n<p>API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u304d\u306f\u3001\u5bfe\u5fdc\u3059\u308b HTTP \u30e1\u30bd\u30c3\u30c9\u3068 URI \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3001\u304a\u3088\u3073\u6b63\u3057\u3044\u8981\u6c42\u30d8\u30c3\u30c0\u30fc\u3068\u30c7\u30fc\u30bf\u5f62\u5f0f\u3092\u4f7f\u7528\u3057\u3066\u3001API \u306e\u6b63\u78ba\u6027\u3068\u53ef\u7528\u6027\u3092\u78ba\u4fdd\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-RESTful \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf\u3068\u64cd\u4f5c\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3068\u7ba1\u7406\u3092\u63d0\u4f9b\u3059\u308b RESTful API \u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002\u540c\u6642\u306b\u3001API \u306e\u53ef\u7528\u6027\u3068\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001API \u8a2d\u8a08\u306e\u5408\u7406\u6027\u3001\u30c7\u30fc\u30bf \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u304a\u3088\u3073\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u3068\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3068\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u3068\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u3068\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u51e6\u7406\u3068\u64cd\u4f5c\u306e\u305f\u3081\u306b\u3001HTTP \u30ea\u30af\u30a8\u30b9\u30c8\u3068\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30c7\u30fc\u30bf\u3092\u6307\u5b9a\u3055\u308c\u305f\u30c7\u30fc\u30bf\u69cb\u9020\u306b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3059\u308b\u3053\u3068\u3092\u6307\u3057\u307e\u3059\u3002\u30b7\u30ea\u30a2\u30eb\u5316\u3068\u306f\u3001\u30c7\u30fc\u30bf\u69cb\u9020\u3092\u3001JSON\u3001XML\u3001\u304a\u3088\u3073\u305d\u306e\u4ed6\u306e\u5f62\u5f0f\u306a\u3069\u3001\u9001\u4fe1\u4e2d\u306b\u914d\u4fe1\u304a\u3088\u3073\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306b\u6307\u5b9a\u3055\u308c\u305f\u5f62\u5f0f\u306b\u5909\u63db\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u9006\u30b7\u30ea\u30a2\u30eb\u5316\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u51e6\u7406\u304a\u3088\u3073\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306b\u3001\u6307\u5b9a\u3055\u308c\u305f\u5f62\u5f0f\u3092\u30c7\u30fc\u30bf\u69cb\u9020\u306b\u5909\u63db\u3059\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001jsonify \u30e1\u30bd\u30c3\u30c9\u3068 Flask \u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b\u8981\u6c42\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u3001\u8981\u6c42\u3068\u5fdc\u7b54\u3092\u30b7\u30ea\u30a2\u30eb\u5316\u304a\u3088\u3073\u9006\u30b7\u30ea\u30a2\u30eb\u5316\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5fdc\u7b54\u30c7\u30fc\u30bf\u3092\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001jsonify \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001Python \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092 JSON \u5f62\u5f0f\u306e\u5fdc\u7b54\u30c7\u30fc\u30bf\u306b\u30b7\u30ea\u30a2\u30eb\u5316\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import jsonify\n\n@app.route('\/users')\ndef get_users():\n    users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]\n    return jsonify(users)\n<\/code><\/pre>\n\n\n\n<p>\u5fdc\u7b54\u3067 jsonify \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001Python \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092 JSON \u5f62\u5f0f\u306e\u5fdc\u7b54\u30c7\u30fc\u30bf\u306b\u30b7\u30ea\u30a2\u30eb\u5316\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u89e3\u6790\u304a\u3088\u3073\u51e6\u7406\u3059\u308b\u306e\u306b\u4fbf\u5229\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8 \u30c7\u30fc\u30bf\u306e\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30ea\u30af\u30a8\u30b9\u30c8 \u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30ea\u30af\u30a8\u30b9\u30c8 \u30c7\u30fc\u30bf\u3092\u9006\u30b7\u30ea\u30a2\u30eb\u5316\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import request\n\n@app.route('\/users', methods=['POST'])\ndef create_user():\n    data = request.get_json()\n    name = data['name']\n    # \u521b\u5efa\u65b0\u7528\u6237\n<\/code><\/pre>\n\n\n\n<p>\u30ea\u30af\u30a8\u30b9\u30c8\u3067 get_json \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001JSON \u5f62\u5f0f\u306e\u30ea\u30af\u30a8\u30b9\u30c8 \u30c7\u30fc\u30bf\u3092 Python \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u9006\u30b7\u30ea\u30a2\u30eb\u5316\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u51e6\u7406\u304a\u3088\u3073\u64cd\u4f5c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u8981\u6c42\u3068\u5fdc\u7b54\u306e\u30b7\u30ea\u30a2\u30eb\u5316\u3068\u9006\u30b7\u30ea\u30a2\u30eb\u5316\u306f\u3001HTTP \u8981\u6c42\u3068\u5fdc\u7b54\u306e\u30c7\u30fc\u30bf\u3092\u6307\u5b9a\u3055\u308c\u305f\u30c7\u30fc\u30bf\u69cb\u9020\u306b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3059\u308b\u3053\u3068\u3092\u6307\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001Flask \u304c\u63d0\u4f9b\u3059\u308b jsonify \u30e1\u30bd\u30c3\u30c9\u3068\u8981\u6c42\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u540c\u6642\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3068\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u30c7\u30fc\u30bf\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u6b63\u78ba\u3055\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068 Swagger \u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u306f\u3001\u958b\u767a\u8005\u3001\u30c6\u30b9\u30bf\u30fc\u3001\u304a\u3088\u3073\u305d\u306e\u4ed6\u306e\u95a2\u9023\u62c5\u5f53\u8005\u304c API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4f7f\u7528\u3059\u308b\u3088\u3046\u306b\u30ac\u30a4\u30c9\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306b\u3064\u3044\u3066\u8aac\u660e\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u6307\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u306f\u3001\u95a2\u6570\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3001\u8981\u6c42\u304a\u3088\u3073\u5fdc\u7b54\u306e\u5f62\u5f0f\u3001\u30a8\u30e9\u30fc \u30b3\u30fc\u30c9\u3001\u304a\u3088\u3073 API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u305d\u306e\u4ed6\u306e\u60c5\u5831\u304c\u542b\u307e\u308c\u307e\u3059\u3002API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u4f7f\u3044\u3084\u3059\u3055\u3068\u4fe1\u983c\u6027\u3092\u5411\u4e0a\u3055\u305b\u3001\u958b\u767a\u3068\u30c6\u30b9\u30c8\u306e\u30b3\u30b9\u30c8\u3092\u524a\u6e1b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Swagger \u306f\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u8a2d\u8a08\u3001\u69cb\u7bc9\u3001\u6587\u66f8\u5316\u3001\u304a\u3088\u3073\u30c6\u30b9\u30c8\u3092\u884c\u3046\u305f\u3081\u306e\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 API \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u304a\u3088\u3073\u30c4\u30fc\u30eb\u3067\u3059\u3002Swagger \u306f\u3001Java\u3001Python\u3001PHP\u3001Ruby\u3001Node.js \u306a\u3069\u306e\u8907\u6570\u306e\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\u3068\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3001Web \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3068 UI \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u63d0\u4f9b\u3057\u3066\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u8a2d\u8a08\u3001\u958b\u767a\u3001\u304a\u3088\u3073\u30c6\u30b9\u30c8\u3092\u3088\u308a\u4fbf\u5229\u3067\u8996\u899a\u7684\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001Flask-RESTful-swagger-2 \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066 Swagger \u6a5f\u80fd\u3092\u7d71\u5408\u3057\u3001API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u81ea\u52d5\u751f\u6210\u3068\u7ba1\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask-RESTful-swagger-2 \u3092\u4f7f\u7528\u3057\u3066 API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u4f5c\u6210\u3059\u308b\u624b\u9806\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-RESTful-swagger-2 \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001pip \u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Flask-RESTful-swagger-2 \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install flask-restful-swagger-2\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>API \u30ea\u30bd\u30fc\u30b9\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001API \u30ea\u30bd\u30fc\u30b9 \u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u3001Flask-RESTful \u306b\u3088\u3063\u3066\u63d0\u4f9b\u3055\u308c\u308b Resource \u30af\u30e9\u30b9\u304b\u3089\u7d99\u627f\u3057\u3001\u5bfe\u5fdc\u3059\u308b HTTP \u30e1\u30bd\u30c3\u30c9\u3068\u64cd\u4f5c\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask_restful import Resource\nfrom flask_restful_swagger_2 import swagger\n\nclass User(Resource):\n    @swagger.doc({\n        'tags': ['users'],\n        'description': 'Get user by ID',\n        'parameters': [\n            {\n                'name': 'id',\n                'description': 'User ID',\n                'type': 'int',\n                'required': True\n            }\n        ],\n        'responses': {\n            '200': {\n                'description': 'User object',\n                'schema': UserSchema\n            },\n            '404': {\n                'description': 'User not found'\n            }\n        }\n    })\n    def get(self, id):\n        # \u83b7\u53d6\u7528\u6237\u4fe1\u606f\n        pass\n<\/code><\/pre>\n\n\n\n<p>API \u30ea\u30bd\u30fc\u30b9 \u30af\u30e9\u30b9\u3067\u306f\u3001swagger.doc \u30c7\u30b3\u30ec\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e9\u30d9\u30eb\u3001\u8aac\u660e\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3001\u5fdc\u7b54\u3001\u304a\u3088\u3073\u305d\u306e\u4ed6\u306e\u60c5\u5831\u3092\u542b\u3080 API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u8aac\u660e\u60c5\u5831\u3092\u5b9a\u7fa9\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u30c7\u30fc\u30bf \u30e2\u30c7\u30eb\u3068\u5f62\u5f0f\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001run \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u59cb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>if __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5\u6642\u306b\u3001\u30c7\u30d0\u30c3\u30b0\u3068\u958b\u767a\u306e\u305f\u3081\u306b\u30c7\u30d0\u30c3\u30b0 \u30d1\u30e9\u30e1\u30fc\u30bf\u3092 True \u306b\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Swagger \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u3001Swagger \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u30c6\u30b9\u30c8 \u30c4\u30fc\u30eb\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">http\u30b3\u30d4\u30fc\u30b3\u30fc\u30c9<code>http:\/\/localhost:5000\/apidocs\/\n<\/code><\/pre>\n\n\n\n<p>Swagger \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u8cc7\u6599\u3068\u30c6\u30b9\u30c8\u30fb\u30c4\u30fc\u30eb\u3092\u8868\u793a\u3057\u3066\u3001\u958b\u767a\u8005\u3068\u30c6\u30b9\u30bf\u30fc\u304c API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u4f7f\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068 Swagger \u306f\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u958b\u767a\u3068\u7ba1\u7406\u306b\u304a\u3044\u3066\u975e\u5e38\u306b\u91cd\u8981\u306a\u30c4\u30fc\u30eb\u3068\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u3042\u308a\u3001API \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u4f7f\u3044\u3084\u3059\u3055\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u5c0e\u5165\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3001\u5c0e\u5165\u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u3001VPS \u306a\u3069\uff09\u3092\u6700\u9069\u5316\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u74b0\u5883\u304b\u3089\u5b9f\u7a3c\u50cd\u74b0\u5883\u306b\u79fb\u52d5\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u3067\u3042\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\u69cb\u6210\u3001\u30c6\u30b9\u30c8\u3001\u304a\u3088\u3073\u5b9f\u884c\u304c\u542b\u307e\u308c\u307e\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u3055\u307e\u3056\u307e\u306a\u30cb\u30fc\u30ba\u3068\u30b7\u30ca\u30ea\u30aa\u3092\u6e80\u305f\u3059\u305f\u3081\u306b\u3001\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u3001VPS \u306a\u3069\u306e\u3055\u307e\u3056\u307e\u306a\u30c7\u30d7\u30ed\u30a4 \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u306e\u5c55\u958b<\/li>\n<\/ol>\n\n\n\n<p>\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d0\u30fc\u306b\u5c55\u958b\u3059\u308b\u65b9\u6cd5\u3067\u3042\u308a\u3001\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3001\u67d4\u8edf\u6027\u3001\u9ad8\u53ef\u7528\u6027\u3001\u304a\u3088\u3073\u4f7f\u3044\u3084\u3059\u3055\u3068\u3044\u3046\u5229\u70b9\u304c\u3042\u308a\u307e\u3059\u3002\u4e00\u822c\u7684\u306a\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9 \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306b\u306f\u3001Amazon Web Services (AWS)\u3001Microsoft Azure\u3001Google Cloud Platform \u306a\u3069\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u3067\u306f\u3001\u4eee\u60f3\u30de\u30b7\u30f3 (VM) \u3084\u30b3\u30f3\u30c6\u30ca\u30fc (\u30b3\u30f3\u30c6\u30ca\u30fc) \u306a\u3069\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Amazon Elastic Compute Cloud (EC2) \u304c\u63d0\u4f9b\u3059\u308b\u4eee\u60f3\u30de\u30b7\u30f3\u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b<\/li>\n\n\n\n<li>Docker \u30b3\u30f3\u30c6\u30ca \u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001Amazon Elastic Container Service (ECS) \u307e\u305f\u306f Kubernetes \u30af\u30e9\u30b9\u30bf\u30fc\u3067\u30b3\u30f3\u30c6\u30ca\u3092\u5b9f\u884c\u3059\u308b\u306a\u3069\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<p>\u30af\u30e9\u30a6\u30c9 \u30b5\u30fc\u30d3\u30b9\u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u3068\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u304c\u5411\u4e0a\u3057\u307e\u3059\u304c\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3084\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306a\u3069\u306e\u554f\u984c\u306b\u3082\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>VPS\u90e8\u7f72<\/li>\n<\/ol>\n\n\n\n<p>VPS \u306f\u4eee\u60f3\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30b5\u30fc\u30d0\u30fc\u3067\u3042\u308a\u3001\u901a\u5e38\u306f\u4eee\u60f3\u5316\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u7269\u7406\u30b5\u30fc\u30d0\u30fc\u3092\u8907\u6570\u306e\u4eee\u60f3\u30b5\u30fc\u30d0\u30fc\u306b\u5206\u5272\u3057\u307e\u3059\u3002\u5404\u4eee\u60f3\u30b5\u30fc\u30d0\u30fc\u306b\u306f\u72ec\u81ea\u306e\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0 \u30b7\u30b9\u30c6\u30e0\u3068\u30ea\u30bd\u30fc\u30b9\u304c\u3042\u308a\u307e\u3059\u3002VPS \u3067\u306f\u3001Apache\u3001Nginx\u3001MySQL \u306a\u3069\u306e\u3055\u307e\u3056\u307e\u306a Web \u30b5\u30fc\u30d0\u30fc \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3068\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3092\u4f7f\u7528\u3057\u3066\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092 VPS \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\u69cb\u6210\u3001\u30c6\u30b9\u30c8\u3001\u6700\u9069\u5316\u306a\u3069\u306e\u624b\u9806\u3092\u542b\u3080\u3001\u30b7\u30b9\u30c6\u30e0\u3068\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306e\u69cb\u6210\u3068\u7ba1\u7406\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u5c55\u958b\u3092\u6700\u9069\u5316\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5b89\u5b9a\u6027\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u3001\u6b21\u306e\u6700\u9069\u5316\u624b\u6bb5\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u3092\u4f7f\u7528\u3057\u3066\u30ea\u30af\u30a8\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u5206\u6563\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b<\/li>\n\n\n\n<li>Redis \u3084 Memcached \u306a\u3069\u306e\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0 \u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3068\u5fdc\u7b54\u6642\u9593\u3092\u77ed\u7e2e\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>HTTPS \u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u8ee2\u9001\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u6574\u5408\u6027\u3092\u78ba\u4fdd\u3057\u3001\u60c5\u5831\u306e\u6f0f\u6d29\u3084\u653b\u6483\u3092\u56de\u907f\u3057\u307e\u3059<\/li>\n\n\n\n<li>\u76e3\u8996\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u30b9\u30c6\u30fc\u30bf\u30b9\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9 \u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u30fc\u3092\u76e3\u8996\u3057\u3001\u554f\u984c\u3092\u30bf\u30a4\u30e0\u30ea\u30fc\u306b\u898b\u3064\u3051\u3066\u89e3\u6c7a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30ed\u30ae\u30f3\u30b0 \u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u30ed\u30b0\u3068\u4f8b\u5916\u60c5\u5831\u3092\u8a18\u9332\u3057\u3001\u305d\u306e\u5f8c\u306e\u5206\u6790\u3068\u6700\u9069\u5316\u3092\u884c\u3046<\/li>\n<\/ul>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u74b0\u5883\u304b\u3089\u672c\u756a\u74b0\u5883\u306b\u79fb\u884c\u3059\u308b\u969b\u306e\u91cd\u8981\u306a\u30b9\u30c6\u30c3\u30d7\u3067\u3059\u3002\u30c7\u30d7\u30ed\u30a4 \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3068\u304d\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30cb\u30fc\u30ba\u3068\u30b7\u30ca\u30ea\u30aa\u3092\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u53ef\u7528\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u6642\u9593\u3092\u6700\u9069\u5316\u3057\u3001\u76e3\u8996\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3002\u4ee5\u4e0b\u306b\u3001\u4e00\u822c\u7684\u306a\u6700\u9069\u5316\u624b\u6cd5\u3092\u3044\u304f\u3064\u304b\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u306e\u6700\u9069\u5316: \u30ad\u30e3\u30c3\u30b7\u30e5\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u306e\u524a\u6e1b\u3001\u975e\u540c\u671f\u51e6\u7406\u306a\u3069\u306e\u624b\u6cd5\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b3\u30fc\u30c9\u3092\u6700\u9069\u5316\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u306e\u6700\u9069\u5316: \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306f\u3001\u30b5\u30fc\u30d0\u30fc\u306e CPU\u3001\u30e1\u30e2\u30ea\u3001\u30c7\u30a3\u30b9\u30af\u3001\u304a\u3088\u3073\u305d\u306e\u4ed6\u306e\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2 \u30ea\u30bd\u30fc\u30b9\u3092\u5897\u3084\u3059\u3053\u3068\u3067\u6539\u5584\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6700\u9069\u5316: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\u3001\u30af\u30a8\u30ea\u306e\u6700\u9069\u5316\u3001\u30c7\u30fc\u30bf \u30b7\u30e3\u30fc\u30c7\u30a3\u30f3\u30b0\u3001\u304a\u3088\u3073\u305d\u306e\u4ed6\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6700\u9069\u5316\u3057\u3001\u30c7\u30fc\u30bf \u30a2\u30af\u30bb\u30b9\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u6700\u9069\u5316: CDN \u306a\u3069\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3001\u8981\u6c42\u30b5\u30a4\u30ba\u3092\u7e2e\u5c0f\u3057\u3001HTTP2 \u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4f1d\u9001\u3092\u6700\u9069\u5316\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u306e\u6700\u9069\u5316: \u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3001\u30b3\u30f3\u30c6\u30ca\u30fc\u5316\u3055\u308c\u305f\u30c7\u30d7\u30ed\u30a4\u3001\u5206\u6563\u30c7\u30d7\u30ed\u30a4\u306a\u3069\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30d7\u30ed\u30a4\u3092\u6700\u9069\u5316\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u5c55\u958b\u3092\u6700\u9069\u5316\u3059\u308b\u30d7\u30ed\u30bb\u30b9\u3067\u306f\u3001\u6700\u9069\u306a\u6700\u9069\u5316\u52b9\u679c\u3092\u5f97\u308b\u305f\u3081\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u969b\u306e\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u9078\u629e\u3057\u3066\u7df4\u7fd2\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u914d\u7f6e\u3068\u6700\u9069\u5316\u306f\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u304b\u3089\u8d77\u52d5\u307e\u3067\u306e\u91cd\u8981\u306a\u30ea\u30f3\u30af\u3067\u3059. \u914d\u7f6e\u3068\u6700\u9069\u5316\u306e\u969b\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8981\u4ef6\u3068\u30b7\u30ca\u30ea\u30aa\u3092\u8003\u616e\u3057\u3001\u6700\u9069\u306a\u30c4\u30fc\u30eb\u3068\u624b\u6cd5\u3092\u4f7f\u7528\u3057\u3066\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u53ef\u7528\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5fdc\u7528\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>WSGI \u30b5\u30fc\u30d0\u30fc (Gunicorn\u3001uWSGI \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u30c7\u30d7\u30ed\u30a4\u3068\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>WSGI (Web Server Gateway Interface) \u306f\u3001Python Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068 Web \u30b5\u30fc\u30d0\u30fc\u9593\u306e\u6a19\u6e96\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u3042\u308a\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068 Web \u30b5\u30fc\u30d0\u30fc\u9593\u306e\u901a\u4fe1\u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u3067\u306f\u3001WSGI \u30b5\u30fc\u30d0\u30fc\u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u53ef\u7528\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b WSGI \u30b5\u30fc\u30d0\u30fc\u306b\u306f\u3001Gunicorn\u3001uWSGI\u3001mod_wsgi \u306a\u3069\u304c\u3042\u308a\u307e\u3059\u3002Gunicorn \u3092\u4f8b\u3068\u3057\u3066\u3001WSGI \u30b5\u30fc\u30d0\u30fc\u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ac\u30f3\u30b3\u30fc\u30f3\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<p>Gunicorn \u306f\u3001pip \u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>pip install gunicorn\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Gunicorn \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Gunicorn \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3092\u8a18\u8ff0\u3057\u3066\u3001Gunicorn \u30b5\u30fc\u30d0\u30fc\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u69cb\u6210\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067 gunicorn.conf \u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">makefile\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>workers = 4\nbind = \"127.0.0.1:8000\"\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u4e2d\u3067\u3001workers \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306f Gunicorn \u30b5\u30fc\u30d0\u30fc\u304c\u4f7f\u7528\u3059\u308b\u30ef\u30fc\u30ab\u30fc \u30d7\u30ed\u30bb\u30b9\u306e\u6570\u3092\u6307\u5b9a\u3057\u3001bind \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306f\u30b5\u30fc\u30d0\u30fc\u306b\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u305f IP \u30a2\u30c9\u30ec\u30b9\u3068\u30dd\u30fc\u30c8\u756a\u53f7\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Gunicorn \u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u884c\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30eb\u30fc\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066 Gunicorn \u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">r\u30b3\u30d4\u30fc\u30b3\u30fc\u30c9<code>gunicorn app:app -c gunicorn.conf\n<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u4e2d\u3067\u3001app:app \u306f Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u5909\u6570\u540d\u3092\u8868\u3057\u3001-c \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306f Gunicorn \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3092\u69cb\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>WSGI \u30b5\u30fc\u30d0\u30fc\u3067 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408\u3001\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3092\u69cb\u6210\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7 \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306b\u306f\u3001Nginx \u3068 Apache \u304c\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u6b21\u306e\u69cb\u6210\u3092 Nginx \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">perl\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>location \/ {\n    proxy_pass http:\/\/127.0.0.1:8000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n}\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3046\u3061\u3001proxy_pass \u306f\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u306e\u30bf\u30fc\u30b2\u30c3\u30c8 \u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u3001$host \u3068 $remote_addr \u306f\u305d\u308c\u305e\u308c\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30db\u30b9\u30c8\u540d\u3068 IP \u30a2\u30c9\u30ec\u30b9\u3092\u8868\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u5c55\u958b\u3092\u6700\u9069\u5316\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>WSGI \u30b5\u30fc\u30d0\u30fc\u3067 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408\u3001\u6b21\u306e\u65b9\u6cd5\u3067\u30c7\u30d7\u30ed\u30a4\u3092\u6700\u9069\u5316\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30bb\u30b9\u7ba1\u7406\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3059\u308b: \u30b9\u30fc\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306a\u3069\u306e\u30d7\u30ed\u30bb\u30b9\u7ba1\u7406\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066 Gunicorn \u30d7\u30ed\u30bb\u30b9\u3092\u7ba1\u7406\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u5b89\u5b9a\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u69cb\u6210: Redis \u3084 Memcached \u306a\u3069\u306e\u30ad\u30e3\u30c3\u30b7\u30e5 \u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3068\u5fdc\u7b54\u6642\u9593\u3092\u77ed\u7e2e\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u69cb\u6210\u3059\u308b: \u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u4f7f\u7528\u3057\u3066\u8981\u6c42\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u5206\u6563\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001WSGI \u30b5\u30fc\u30d0\u30fc\u3067 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u53ef\u7528\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u4e00\u822c\u7684\u306a\u30c7\u30d7\u30ed\u30a4\u65b9\u6cd5\u3067\u3059\u3002\u5c55\u958b\u30d7\u30ed\u30bb\u30b9\u4e2d\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001\u6700\u9069\u5316\u3084\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306a\u3069\u306e\u554f\u984c\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3059\u308b\u5834\u5408\u306e\u5c55\u958b\u3068\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>Nginx \u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u3068\u6700\u9069\u5316\u306b\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u9ad8\u6027\u80fd\u3067\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306a Web \u30b5\u30fc\u30d0\u30fc\u304a\u3088\u3073\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7 \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u5834\u5408\u3001Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u65b9\u6cd5\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nginx\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Nginx \u306f\u3001apt-get \u3084 yum \u306a\u3069\u306e\u30d1\u30c3\u30b1\u30fc\u30b8 \u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001Ubuntu \u30b7\u30b9\u30c6\u30e0\u3067\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066 Nginx \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">arduino\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>sudo apt-get install nginx\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Nginx \u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u306e\u69cb\u6210<\/li>\n<\/ol>\n\n\n\n<p>\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u306f\u3001Nginx \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3067\u69cb\u6210\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001flask \u3068\u3044\u3046\u540d\u524d\u306e\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3092 \/etc\/nginx\/sites-available \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u6b21\u306e\u5185\u5bb9\u3067\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">perl\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>server {\n    listen 80;\n    server_name example.com;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:8000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u3046\u3061\u3001listen \u306f Nginx \u304c\u30ea\u30c3\u30b9\u30f3\u3059\u308b\u30dd\u30fc\u30c8\u756a\u53f7\u3092\u6307\u5b9a\u3057\u3001server_name \u306f\u30c9\u30e1\u30a4\u30f3\u540d\u307e\u305f\u306f IP \u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u3001location \u306f URL \u30d1\u30b9\u3068\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u306e\u30bf\u30fc\u30b2\u30c3\u30c8 \u30a2\u30c9\u30ec\u30b9\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Nginx \u30b5\u30fc\u30d3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u307e\u3059<\/li>\n<\/ol>\n\n\n\n<p>\u69cb\u6210\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001Nginx \u30b5\u30fc\u30d3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u3066\u69cb\u6210\u3092\u6709\u52b9\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>sudo service nginx restart\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>WSGI \u30b5\u30fc\u30d0\u30fc (Gunicorn\u3001uWSGI \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3001Nginx \u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3067\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u306e\u30bf\u30fc\u30b2\u30c3\u30c8 \u30a2\u30c9\u30ec\u30b9\u3092 WSGI \u30b5\u30fc\u30d0\u30fc\u306e\u30a2\u30c9\u30ec\u30b9\u3068\u30dd\u30fc\u30c8\u756a\u53f7\u3068\u3057\u3066\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u69cb\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u69cb\u6210\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u53ef\u7528\u6027\u3092\u3055\u3089\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0: Nginx \u30ad\u30e3\u30c3\u30b7\u30f3\u30b0 \u30e2\u30b8\u30e5\u30fc\u30eb (proxy_cache \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u9759\u7684\u30ea\u30bd\u30fc\u30b9\u3068\u52d5\u7684\u30da\u30fc\u30b8\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u3092\u8efd\u6e1b\u3057\u3066\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc: Nginx \u306e\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b7\u30f3\u30b0 \u30e2\u30b8\u30e5\u30fc\u30eb (\u30a2\u30c3\u30d7\u30b9\u30c8\u30ea\u30fc\u30e0\u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u3001\u30ea\u30af\u30a8\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u5206\u6563\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53ef\u7528\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001Nginx \u3092\u30ea\u30d0\u30fc\u30b9 \u30d7\u30ed\u30ad\u30b7\u3068\u3057\u3066\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5411\u4e0a\u3055\u305b\u308b\u4e00\u822c\u7684\u306a\u5c55\u958b\u3067\u3059\u3002\u5c55\u958b\u30d7\u30ed\u30bb\u30b9\u4e2d\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u3001Nginx \u306e\u69cb\u6210\u3084\u6700\u9069\u5316\u306a\u3069\u306e\u554f\u984c\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u5c55\u958b\u3068\u6700\u9069\u5316\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6226\u7565\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5c55\u958b\u306b\u304a\u3044\u3066\u975e\u5e38\u306b\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u4e2d\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u308b\u305f\u3081\u306b\u3001\u4e00\u9023\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3092\u63a1\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3044\u304f\u3064\u304b\u306e\u4e00\u822c\u7684\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3092\u4ee5\u4e0b\u306b\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6280\u8853\u3092\u5229\u7528\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0 \u30c6\u30af\u30ce\u30ed\u30b8\u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5fdc\u7b54\u6642\u9593\u3068\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u3092\u52b9\u679c\u7684\u306b\u524a\u6e1b\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4e00\u822c\u7684\u306a\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u624b\u6cd5\u306b\u306f\u6b21\u306e\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9759\u7684\u30ea\u30bd\u30fc\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5: \u30d6\u30e9\u30a6\u30b6\u30fc\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3084 CDN \u306a\u3069\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3001\u9759\u7684\u30ea\u30bd\u30fc\u30b9\u306b\u5bfe\u3059\u308b\u7e70\u308a\u8fd4\u3057\u306e\u8981\u6c42\u3092\u6e1b\u3089\u3057\u3001\u30da\u30fc\u30b8\u306e\u8aad\u307f\u8fbc\u307f\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u52d5\u7684\u30da\u30fc\u30b8 \u30ad\u30e3\u30c3\u30b7\u30e5: \u30ad\u30e3\u30c3\u30b7\u30e5 \u30c6\u30af\u30ce\u30ed\u30b8 (Redis\u3001Memcached \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u52d5\u7684\u30da\u30fc\u30b8\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3068\u30b5\u30fc\u30d0\u30fc\u8ca0\u8377\u3092\u8efd\u6e1b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30ad\u30e3\u30c3\u30b7\u30e5: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30ad\u30e3\u30c3\u30b7\u30e5 \u30c6\u30af\u30ce\u30ed\u30b8 (MySQL \u30ad\u30e3\u30c3\u30b7\u30e5\u3001Redis \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u30af\u30a8\u30ea\u7d50\u679c\u3068\u30c7\u30fc\u30bf\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3068\u5fdc\u7b54\u6642\u9593\u3092\u77ed\u7e2e\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30b5\u30fc\u30d0\u30fc\u3092\u5408\u7406\u7684\u306b\u69cb\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30b5\u30fc\u30d0\u30fc\u306e\u69cb\u6210\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u5f79\u5272\u3092\u679c\u305f\u3057\u307e\u3059\u3002\u30b5\u30fc\u30d0\u30fc\u3092\u9069\u5207\u306b\u69cb\u6210\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u65b9\u6cd5\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b5\u30fc\u30d0\u30fc \u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8abf\u6574: \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u7279\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306b\u5fdc\u3058\u3066\u3001\u30b5\u30fc\u30d0\u30fc \u30d1\u30e9\u30e1\u30fc\u30bf (\u30e1\u30e2\u30ea\u3001CPU\u3001\u30c7\u30a3\u30b9\u30af\u306a\u3069) \u3092\u8abf\u6574\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u4f7f\u7528\u3059\u308b: \u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u4f7f\u7528\u3057\u3066\u3001\u8981\u6c42\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u5206\u6563\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u5206\u6563\u3068\u53ef\u7528\u6027\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n\n\n\n<li>CDN \u3092\u4f7f\u7528\u3059\u308b: CDN \u3092\u4f7f\u7528\u3057\u3066\u3001\u9759\u7684\u30ea\u30bd\u30fc\u30b9\u3092\u5206\u6563\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u3092\u8efd\u6e1b\u3057\u3001\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30b3\u30fc\u30c9\u3068\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30af\u30a8\u30ea\u3092\u6700\u9069\u5316\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30b3\u30fc\u30c9\u3068\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30af\u30a8\u30ea\u3092\u6700\u9069\u5316\u3059\u308b\u3068\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5fdc\u7b54\u6027\u3092\u52b9\u679c\u7684\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4e00\u822c\u7684\u306a\u6700\u9069\u5316\u65b9\u6cd5\u306b\u306f\u6b21\u306e\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u306e\u6700\u9069\u5316: \u30b3\u30fc\u30c9\u306e\u5197\u9577\u6027\u3092\u6392\u9664\u3057\u3001\u904e\u5270\u306a IO \u64cd\u4f5c\u3092\u56de\u907f\u3057\u3001\u8a08\u7b97\u306e\u7e70\u308a\u8fd4\u3057\u3092\u56de\u907f\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30af\u30a8\u30ea\u306e\u6700\u9069\u5316: \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f7f\u7528\u3001\u30c6\u30fc\u30d6\u30eb\u5168\u4f53\u306e\u30b9\u30ad\u30e3\u30f3\u306e\u56de\u907f\u3001OR \u30af\u30a8\u30ea\u306e\u4f7f\u7528\u306e\u56de\u907f\u3001\u30da\u30fc\u30b8\u30f3\u30b0 \u30af\u30a8\u30ea\u306e\u4f7f\u7528\u306a\u3069\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3092\u4f7f\u7528\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6226\u7565\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u8981\u6c42\u3092\u6e1b\u3089\u3059\u3053\u3068\u304c\u3067\u304d\u308b\u305f\u3081\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5fdc\u7b54\u6027\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002\u4e00\u822c\u7684\u306a\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6226\u7565\u306b\u306f\u6b21\u306e\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTTP \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565: HTTP \u30d8\u30c3\u30c0\u30fc\u3092\u4f7f\u7528\u3057\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5236\u5fa1\u3057\u3001Expires \u3084 Cache-Control \u306a\u3069\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u5236\u5fa1\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565: \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30ad\u30e3\u30c3\u30b7\u30e5 \u30c6\u30af\u30ce\u30ed\u30b8 (Redis\u3001Memcached \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u30af\u30a8\u30ea\u7d50\u679c\u3068\u30c7\u30fc\u30bf\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3068\u5fdc\u7b54\u6642\u9593\u3092\u77ed\u7e2e\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>CDN \u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6226\u7565: CDN \u3092\u4f7f\u7528\u3057\u3066\u9759\u7684\u30ea\u30bd\u30fc\u30b9\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u3092\u8efd\u6e1b\u3057\u3001\u5fdc\u7b54\u3092\u6539\u5584\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u975e\u540c\u671f\u51e6\u7406\u3068\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u975e\u540c\u671f\u51e6\u7406\u3068\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u540c\u6642\u5b9f\u884c\u6027\u3068\u5fdc\u7b54\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4e00\u822c\u7684\u306a\u65b9\u6cd5\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u975e\u540c\u671f\u51e6\u7406: \u975e\u540c\u671f\u30bf\u30b9\u30af \u30ad\u30e5\u30fc (Celery \u306a\u3069) \u307e\u305f\u306f\u975e\u540c\u671f\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af (aiohttp \u306a\u3069) \u3092\u4f7f\u7528\u3057\u3066\u6642\u9593\u306e\u304b\u304b\u308b\u30bf\u30b9\u30af\u3092\u51e6\u7406\u3059\u308b\u3053\u3068\u3067\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u8ca0\u8377\u3092\u89e3\u653e\u3057\u3001\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9: \u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9 \u30c6\u30af\u30ce\u30ed\u30b8\u3092\u4f7f\u7528\u3057\u3066\u540c\u6642\u8981\u6c42\u3092\u51e6\u7406\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u306e\u540c\u6642\u51e6\u7406\u80fd\u529b\u3068\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6226\u7565\u306f\u3001Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5c55\u958b\u306b\u304a\u3044\u3066\u975e\u5e38\u306b\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u5834\u5408\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5fdc\u7b54\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u308b\u305f\u3081\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u7279\u6027\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306b\u57fa\u3065\u3044\u3066\u3001\u9069\u5207\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask \u62e1\u5f35\u6a5f\u80fd\u3068\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af \u4e00\u822c\u7684\u306a Flask \u62e1\u5f35\u6a5f\u80fd\u306e\u7d39\u4ecb<\/p>\n\n\n\n<p>Flask \u62e1\u5f35\u6a5f\u80fd\u306f\u3001\u958b\u767a\u8005\u304c\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3 \u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u901a\u3058\u3066 Flask \u306e\u6a5f\u80fd\u3092\u62e1\u5f35\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u30e1\u30ab\u30cb\u30ba\u30e0\u3067\u3059\u3002Flask \u62e1\u5f35\u6a5f\u80fd\u306f\u3001\u958b\u767a\u8005\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3001API \u958b\u767a\u306a\u3069\u306e\u4e00\u822c\u7684\u306a\u6a5f\u80fd\u3092\u8fc5\u901f\u306b\u5b9f\u88c5\u3059\u308b\u306e\u306b\u5f79\u7acb\u3061\u3001\u958b\u767a\u52b9\u7387\u3068\u30b3\u30fc\u30c9\u54c1\u8cea\u3092\u5411\u4e0a\u3055\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b Flask \u62e1\u5f35\u6a5f\u80fd\u3092\u6b21\u306b\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30e9\u30b9\u30b3\u30ed\u30b0\u30a4\u30f3<\/li>\n<\/ol>\n\n\n\n<p>Flask-Login \u306f\u3001\u30e6\u30fc\u30b6\u30fc \u30bb\u30c3\u30b7\u30e7\u30f3\u3068\u8a8d\u8a3c\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u958b\u767a\u8005\u304c\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30b0\u30a4\u30f3\u3001\u30ed\u30b0\u30a2\u30a6\u30c8\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u8a18\u61b6\u3001\u30e6\u30fc\u30b6\u30fc \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u7ba1\u7406\u306a\u3069\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d5\u30e9\u30b9\u30b3-WTF<\/li>\n<\/ol>\n\n\n\n<p>Flask-WTF \u306f\u3001\u30d5\u30a9\u30fc\u30e0\u691c\u8a3c\u3001CSRF \u4fdd\u8b77\u3001\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306a\u3069\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3059\u308b\u4f7f\u3044\u3084\u3059\u3044\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u62e1\u5f35\u6a5f\u80fd\u3067\u3042\u308a\u3001\u958b\u767a\u8005\u306f Web \u30d5\u30a9\u30fc\u30e0\u6a5f\u80fd\u3092\u3059\u3070\u3084\u304f\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Flask-SQLAlchemy<\/li>\n<\/ol>\n\n\n\n<p>Flask-SQLAlchemy \u306f\u3001SQLAlchemy ORM \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u3053\u308c\u306f\u3001\u958b\u767a\u8005\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30a2\u30af\u30bb\u30b9\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u5358\u7d14\u306a API \u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Flask-Migrate<\/li>\n<\/ol>\n\n\n\n<p>Flask-Migrate \u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u79fb\u884c\u7528\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u958b\u767a\u8005\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u69cb\u9020\u306e\u79fb\u884c\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u308b\u30b7\u30f3\u30d7\u30eb\u306a API \u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>Flask-RESTful<\/li>\n<\/ol>\n\n\n\n<p>Flask-RESTful \u306f\u3001RESTful API \u3092\u69cb\u7bc9\u3059\u308b\u305f\u3081\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u30b7\u30f3\u30d7\u30eb\u3067\u4f7f\u3044\u3084\u3059\u3044 API \u3092\u63d0\u4f9b\u3057\u3001\u958b\u767a\u8005\u304c RESTful API \u6a5f\u80fd\u3092\u8fc5\u901f\u306b\u5b9f\u88c5\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>\u30d5\u30e9\u30b9\u30b3\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<p>Flask-Caching \u306f\u3001\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u7528\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u3055\u307e\u3056\u307e\u306a\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0 \u30c6\u30af\u30ce\u30ed\u30b8 (\u30e1\u30e2\u30ea \u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u3001Redis \u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u306a\u3069) \u3092\u63d0\u4f9b\u3057\u3001\u958b\u767a\u8005\u304c\u30ad\u30e3\u30c3\u30b7\u30f3\u30b0\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\">\n<li>Flask-SocketIO<\/li>\n<\/ol>\n\n\n\n<p>Flask-SocketIO \u306f\u3001WebSocket \u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3067\u3059\u3002\u958b\u767a\u8005\u304c\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u308b\u4f7f\u3044\u3084\u3059\u3044 API \u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001Flask \u62e1\u5f35\u6a5f\u80fd\u306f Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u30e1\u30ab\u30cb\u30ba\u30e0\u3067\u3042\u308a\u3001\u958b\u767a\u8005\u304c\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b\u6a5f\u80fd\u3092\u8fc5\u901f\u306b\u5b9f\u88c5\u3057\u3001\u958b\u767a\u52b9\u7387\u3068\u30b3\u30fc\u30c9\u54c1\u8cea\u3092\u5411\u4e0a\u3055\u305b\u308b\u306e\u306b\u5f79\u7acb\u3061\u307e\u3059\u3002Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\u4e00\u822c\u7684\u306b\u4f7f\u7528\u3055\u308c\u308b Flask \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u958b\u767a\u3092\u9ad8\u901f\u5316\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u54c1\u8cea\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u306e\u30e2\u30b8\u30e5\u30e9\u30fc \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u3092\u4f7f\u7528\u3057\u3066\u3001Flask \u306e\u62e1\u5f35\u6a5f\u80fd\u3068\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u7dad\u6301\u3059\u308b\u305f\u3081\u306b\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\u901a\u5e38\u8907\u6570\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u5206\u5272\u3055\u308c\u3001\u5404\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u306f\u72ec\u7acb\u3057\u305f\u6a5f\u80fd\u3068\u30eb\u30fc\u30c8\u304c\u3042\u308a\u307e\u3059\u3002Blueprint (\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8) \u3092 Flask \u3067\u4f7f\u7528\u3057\u3066\u3001\u30e2\u30b8\u30e5\u30e9\u30fc \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Blueprint \u306f Flask \u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3042\u308a\u3001\u958b\u767a\u8005\u304c\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3088\u308a\u5c0f\u3055\u304f\u7ba1\u7406\u3057\u3084\u3059\u3044\u90e8\u5206\u306b\u5206\u5272\u3057\u3001\u305d\u308c\u305e\u308c\u3092\u500b\u5225\u306b\u8a18\u8ff0\u3057\u3066\u30c6\u30b9\u30c8\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u958b\u767a\u8005\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3001\u518d\u5229\u7528\u3001\u304a\u3088\u3073\u62e1\u5f35\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u306e\u4f7f\u7528\u306f\u3001\u6b21\u306e\u624b\u9806\u306b\u5206\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u6700\u521d\u306b\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Blueprint\n\nbp = Blueprint('auth', __name__)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u300cauth\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u6210\u3055\u308c\u3001\u305d\u306e 2 \u756a\u76ee\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc __name__ \u306f\u30e2\u30b8\u30e5\u30fc\u30eb\u540d\u3092\u8868\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u6b21\u306e\u3088\u3046\u306b\u30d3\u30e5\u30fc\u95a2\u6570\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@bp.route('\/login')\ndef login():\n    return 'Login page'\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001\u6587\u5b57\u5217\u300c\u30ed\u30b0\u30a4\u30f3\u30da\u30fc\u30b8\u300d\u3092\u8fd4\u3059\u300c\u30ed\u30b0\u30a4\u30f3\u300d\u3068\u3044\u3046\u30eb\u30fc\u30c8\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u767b\u9332\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8 \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u767b\u9332\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\napp.register_blueprint(bp, url_prefix='\/auth')\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001Blueprint \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u767b\u9332\u3057\u3001URL \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u300c\/auth\u300d\u3068\u3057\u3066\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8907\u6570\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u5206\u5272\u3057\u3001\u305d\u308c\u305e\u308c\u306b\u72ec\u7acb\u3057\u305f\u6a5f\u80fd\u3068\u30eb\u30fc\u30c8\u3092\u6301\u305f\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u305f\u3081\u3001\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002\u30d6\u30eb\u30fc\u30d7\u30ea\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3001\u30d5\u30a1\u30a4\u30eb \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306a\u3069\u306e\u518d\u5229\u7528\u53ef\u80fd\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u306e\u62e1\u5f35\u6a5f\u80fd\u3068\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af\u306b\u3064\u3044\u3066 Flask \u3068 WebSocket \u306e\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>WebSocket \u306f\u3001Web \u30d6\u30e9\u30a6\u30b6\u30fc\u3068\u30b5\u30fc\u30d0\u30fc\u9593\u306e\u5168\u4e8c\u91cd\u901a\u4fe1\u306e\u305f\u3081\u306e\u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u3042\u308a\u3001\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002Flask \u3067\u306f\u3001Flask-SocketIO \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066 WebSocket \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask-SocketIO \u62e1\u5f35\u6a5f\u80fd\u306f\u3001WebSocket \u30d7\u30ed\u30c8\u30b3\u30eb\u306b\u57fa\u3065\u304f\u53cc\u65b9\u5411\u901a\u4fe1\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3001\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u3092\u5bb9\u6613\u306b\u3059\u308b\u30b7\u30f3\u30d7\u30eb\u306a API \u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u3067\u306f\u3001Flask-SocketIO \u3092\u4f7f\u7528\u3057\u3066\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u6a5f\u80fd\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask-SocketIO \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u307e\u305a\u3001Flask-SocketIO \u62e1\u5f35\u6a5f\u80fd\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install flask-socketio\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001SocketIO \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_socketio import SocketIO\n\napp = Flask(__name__)\nsocketio = SocketIO(app)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001\u300csocketio\u300d\u3068\u3044\u3046 SocketIO \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u6210\u3055\u308c\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u767b\u9332\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u5b9a\u7fa9\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>@socketio.on('message')\ndef handle_message(message):\n    print('received message: ' + message)\n    socketio.emit('message', message)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u53d7\u4fe1\u3057\u3066\u200b\u200b\u51fa\u529b\u3057\u3001\u3059\u3079\u3066\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u3059\u308b &#8220;message&#8221; \u3068\u3044\u3046\u540d\u524d\u306e\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>SocketIO \u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u884c\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001SocketIO \u30b5\u30fc\u30d0\u30fc\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>if __name__ == '__main__':\n    socketio.run(app)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001run() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066 SocketIO \u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b3\u30fc\u30c9<\/li>\n<\/ol>\n\n\n\n<p>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067\u306f\u3001JavaScript \u30b3\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u3066 SocketIO \u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u53d7\u4fe1\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">javascript\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>var socket = io.connect('http:\/\/localhost:5000');\n\nsocket.on('connect', function() {\n    console.log('connected');\n});\n\nsocket.on('message', function(message) {\n    console.log('received message: ' + message);\n});\n\nsocket.emit('message', 'Hello, world!');\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001io.connect() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066 SocketIO \u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3001\u300cmessage\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u3053\u306e\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u30fc\u306f\u3001\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u53d7\u4fe1\u3057\u3066\u200b\u200b\u51fa\u529b\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001emit() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30b5\u30fc\u30d0\u30fc\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001Flask-SocketIO \u3092\u4f7f\u3048\u3070\u3001WebSocket \u306e\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u6a5f\u80fd\u3092\u7c21\u5358\u306b\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u30a4\u30d9\u30f3\u30c8 \u30cf\u30f3\u30c9\u30e9\u30fc\u3068\u30af\u30e9\u30a4\u30a2\u30f3\u30c8 \u30b3\u30fc\u30c9\u3092\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u53cc\u65b9\u5411\u901a\u4fe1\u3001\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u3001\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u66f4\u65b0\u306a\u3069\u306e\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044 Flask \u62e1\u5f35\u6a5f\u80fd\u3068\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c6\u30b9\u30c8\u3068\u81ea\u52d5\u5316<\/p>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5404\u6a5f\u80fd\u3092\u30c6\u30b9\u30c8\u3057\u3066\u3001\u6a5f\u80fd\u306e\u6b63\u78ba\u6027\u3068\u5b89\u5b9a\u6027\u3092\u78ba\u8a8d\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002Flask \u3067\u306f\u3001unittest \u3084 pytest \u306a\u3069\u306e\u30c6\u30b9\u30c8 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c6\u30b9\u30c8\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>pytest \u3092\u4f7f\u7528\u3057\u3066 Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c6\u30b9\u30c8\u3059\u308b\u65b9\u6cd5\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>pytest \u3068 pytest-flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<p>\u307e\u305a\u3001pytest \u3068 pytest-flask \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pip install pytest pytest-flask\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210<\/li>\n<\/ol>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4e0b\u306b\u300ctests\u300d\u3068\u3044\u3046\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u3001\u305d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u300ctest_app.py\u300d\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import url_for\n\ndef test_index(client):\n    response = client.get(url_for('index'))\n    assert response.status_code == 200\n    assert b'Hello, world!' in response.data\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u300ctest_index\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30c6\u30b9\u30c8\u95a2\u6570\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u304a\u308a\u3001Flask \u304c\u63d0\u4f9b\u3059\u308b\u30c6\u30b9\u30c8 \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u300cindex\u300d\u30eb\u30fc\u30c8\u3092\u30c6\u30b9\u30c8\u3057\u3001200 \u30b9\u30c6\u30fc\u30bf\u30b9 \u30b3\u30fc\u30c9\u3068\u6b63\u3057\u3044\u5fdc\u7b54\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u8fd4\u3055\u308c\u308b\u304b\u3069\u3046\u304b\u3092\u30c6\u30b9\u30c8\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c6\u30b9\u30c8\u3092\u5b9f\u884c<\/li>\n<\/ol>\n\n\n\n<p>\u30b3\u30de\u30f3\u30c9 \u30e9\u30a4\u30f3\u304b\u3089\u3001pytest \u3092\u5b9f\u884c\u3057\u3066\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002\u6b21\u306b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>pytest\n<\/code><\/pre>\n\n\n\n<p>\u3059\u3079\u3066\u306e\u30c6\u30b9\u30c8\u6a5f\u80fd\u304c\u3053\u3053\u3067\u81ea\u52d5\u7684\u306b\u5b9f\u884c\u3055\u308c\u3001\u30c6\u30b9\u30c8\u7d50\u679c\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30c6\u30b9\u30c8\u3092\u624b\u52d5\u3067\u5b9f\u884c\u3059\u308b\u3060\u3051\u3067\u306a\u304f\u3001CI\/CD \u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u3001\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5c55\u958b\u3092\u81ea\u52d5\u5316\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001Travis CI \u306a\u3069\u306e\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30b9\u30c8\u74b0\u5883\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u3066\u30c6\u30b9\u30c8\u3092\u81ea\u52d5\u5316\u3057\u305f\u308a\u3001Heroku \u306a\u3069\u306e\u30c4\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u308a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u8981\u7d04\u3059\u308b\u3068\u3001\u30c6\u30b9\u30c8 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c6\u30b9\u30c8\u304c\u5bb9\u6613\u306b\u306a\u308a\u3001\u6a5f\u80fd\u306e\u6b63\u78ba\u6027\u3068\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002\u30c6\u30b9\u30c8\u3068\u30c7\u30d7\u30ed\u30a4\u3092\u81ea\u52d5\u5316\u3059\u308b\u3053\u3068\u3067\u3001\u958b\u767a\u52b9\u7387\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u54c1\u8cea\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30b3\u30fc\u30b9\u306e\u6982\u8981\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u8df5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30b9\u306e\u5b66\u7fd2\u3092\u901a\u3058\u3066\u3001Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u30b9\u30ad\u30eb\u3068\u77e5\u8b58\u3092\u7fd2\u5f97\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u306b\u306f\u3001\u4ee5\u4e0b\u304c\u542b\u307e\u308c\u307e\u3059\u304c\u3001\u3053\u308c\u3089\u306b\u9650\u5b9a\u3055\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u57fa\u672c\u6982\u5ff5\u3068\u4f7f\u7528\u6cd5<\/li>\n\n\n\n<li>Python \u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210<\/li>\n\n\n\n<li>\u4eee\u60f3\u74b0\u5883\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>Flask \u62e1\u5f35\u6a5f\u80fd\u306e\u4f7f\u7528\u3068\u7d71\u5408<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f7f\u7528\u3068\u79fb\u884c<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406<\/li>\n\n\n\n<li>RESTful API \u306e\u958b\u767a\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/li>\n\n\n\n<li>WebSocket\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5c55\u958b\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3068\u81ea\u52d5\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30b9\u3067\u306f\u3001\u7406\u8ad6\u7684\u306a\u77e5\u8b58\u3092\u5b66\u3076\u3060\u3051\u3067\u306a\u304f\u3001\u5b9f\u969b\u306e Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u305f\u3081\u306b\u5b66\u3093\u3060\u3053\u3068\u3092\u9069\u7528\u3067\u304d\u308b\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u6a5f\u4f1a\u3082\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30aa\u30f3\u30e9\u30a4\u30f3 \u30b7\u30e7\u30c3\u30d4\u30f3\u30b0 \u30e2\u30fc\u30eb\u3001\u30bd\u30fc\u30b7\u30e3\u30eb \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30d6\u30ed\u30b0\u3001\u30cb\u30e5\u30fc\u30b9 Web \u30b5\u30a4\u30c8\u306a\u3069\u3001\u95a2\u5fc3\u306e\u3042\u308b\u30c8\u30d4\u30c3\u30af\u3068\u30b7\u30ca\u30ea\u30aa\u3092\u9078\u629e\u3057\u3001Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u95a2\u9023\u3059\u308b\u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u3068\u5c55\u958b\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u4fdd\u5b88\u6027\u3001\u304a\u3088\u3073\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u3001\u30c6\u30b9\u30c8 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6b63\u78ba\u6027\u3068\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u672c\u30b3\u30fc\u30b9\u306e\u5b66\u7fd2\u3068\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u8df5\u3092\u901a\u3058\u3066\u3001Flask\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u80fd\u529b\u3068\u7d4c\u9a13\u3092\u8eab\u306b\u3064\u3051\u3001\u5b66\u3093\u3060\u3053\u3068\u3092\u5b9f\u969b\u306e\u696d\u52d9\u3084\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u9069\u7528\u3057\u3066\u9ad8\u54c1\u8cea\u306e\u958b\u767a\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30a6\u30a7\u30d6 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u30b3\u30fc\u30b9\u306e\u6982\u8981\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u8df5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30b9\u306e\u5b66\u7fd2\u3092\u901a\u3058\u3066\u3001Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u30b9\u30ad\u30eb\u3068\u77e5\u8b58\u3092\u7fd2\u5f97\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u306b\u306f\u3001\u4ee5\u4e0b\u304c\u542b\u307e\u308c\u307e\u3059\u304c\u3001\u3053\u308c\u3089\u306b\u9650\u5b9a\u3055\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u57fa\u672c\u6982\u5ff5\u3068\u4f7f\u7528\u6cd5<\/li>\n\n\n\n<li>Python \u74b0\u5883\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u69cb\u6210<\/li>\n\n\n\n<li>\u4eee\u60f3\u74b0\u5883\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>Flask \u62e1\u5f35\u6a5f\u80fd\u306e\u4f7f\u7528\u3068\u7d71\u5408<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f7f\u7528\u3068\u79fb\u884c<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406<\/li>\n\n\n\n<li>RESTful API \u306e\u958b\u767a\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/li>\n\n\n\n<li>WebSocket\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5c55\u958b\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3068\u81ea\u52d5\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30b9\u3067\u306f\u3001\u7406\u8ad6\u7684\u306a\u77e5\u8b58\u3092\u5b66\u3076\u3060\u3051\u3067\u306a\u304f\u3001\u5b9f\u969b\u306e Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u305f\u3081\u306b\u5b66\u3093\u3060\u3053\u3068\u3092\u9069\u7528\u3067\u304d\u308b\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u6a5f\u4f1a\u3082\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30aa\u30f3\u30e9\u30a4\u30f3 \u30b7\u30e7\u30c3\u30d4\u30f3\u30b0 \u30e2\u30fc\u30eb\u3001\u30bd\u30fc\u30b7\u30e3\u30eb \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30d6\u30ed\u30b0\u3001\u30cb\u30e5\u30fc\u30b9 Web \u30b5\u30a4\u30c8\u306a\u3069\u3001\u95a2\u5fc3\u306e\u3042\u308b\u30c8\u30d4\u30c3\u30af\u3068\u30b7\u30ca\u30ea\u30aa\u3092\u9078\u629e\u3057\u3001Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u95a2\u9023\u3059\u308b\u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u3068\u5c55\u958b\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\u30d7\u30ed\u30bb\u30b9\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3001\u4fdd\u5b88\u6027\u3001\u304a\u3088\u3073\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u3001\u30c6\u30b9\u30c8 \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6b63\u78ba\u6027\u3068\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3064\u307e\u308a\u3001\u672c\u30b3\u30fc\u30b9\u306e\u5b66\u7fd2\u3068\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u8df5\u3092\u901a\u3058\u3066\u3001Flask\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u3066Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u80fd\u529b\u3068\u7d4c\u9a13\u3092\u8eab\u306b\u3064\u3051\u3001\u5b66\u3093\u3060\u3053\u3068\u3092\u5b9f\u969b\u306e\u696d\u52d9\u3084\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u9069\u7528\u3057\u3066\u9ad8\u54c1\u8cea\u306e\u958b\u767a\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30a6\u30a7\u30d6 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>Flask \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u5b8c\u5168\u306a\u30c7\u30e2\u30f3\u30b9\u30c8\u30ec\u30fc\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u5b8c\u5168\u306a Flask \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30c7\u30e2\u30f3\u30b9\u30c8\u30ec\u30fc\u30b7\u30e7\u30f3\u306b\u306f\u3001\u6b21\u306e\u3082\u306e\u3092\u542b\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u8981\u4ef6\u306e\u5206\u6790\u3068\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<p>\u307e\u305a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3 \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u6a5f\u80fd\u3001\u30e6\u30fc\u30b6\u30fc \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u306e\u8a2d\u8a08\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u8a08\u3001API \u306e\u8a2d\u8a08\u3001\u5c55\u958b\u8a08\u753b\u306a\u3069\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u3068\u8a2d\u8a08\u8a08\u753b\u3092\u6c7a\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u30aa\u30f3\u30e9\u30a4\u30f3 \u30e2\u30fc\u30eb\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u8981\u4ef6\u306b\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u767b\u9332\u3068\u30ed\u30b0\u30a4\u30f3\u3001\u88fd\u54c1\u306e\u8868\u793a\u3068\u8cfc\u5165\u3001\u6ce8\u6587\u7ba1\u7406\u3001\u652f\u6255\u3044\u6a5f\u80fd\u306a\u3069\u304c\u542b\u307e\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>\u74b0\u5883\u69cb\u7bc9\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u521d\u671f\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\u306b Python \u3068 Flask \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u69cb\u6210\u3057\u3001\u4eee\u60f3\u74b0\u5883\u3068 pip \u3092\u4f7f\u7528\u3057\u3066\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u57fa\u672c\u69cb\u6210\u3068\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u300cmyapp\u300d\u3068\u3044\u3046\u540d\u524d\u306e Flask \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3066\u521d\u671f\u5316\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>$ mkdir myapp\n$ cd myapp\n$ python3 -m venv venv\n$ source venv\/bin\/activate\n(venv) $ pip install Flask\n<\/code><\/pre>\n\n\n\n<p>\u6b21\u306b\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u300capp.py\u300d\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    return 'Hello, world!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u300cindex\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30eb\u30fc\u30c8\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u304a\u308a\u3001\u30eb\u30fc\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u300cHello, world!\u300d\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u306e\u8a2d\u8a08\u3068\u79fb\u884c<\/li>\n<\/ol>\n\n\n\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5f93\u3063\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 \u30e2\u30c7\u30eb\u3068\u95a2\u4fc2\u3092\u8a2d\u8a08\u3057\u3001Flask-SQLAlchemy \u306a\u3069\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u64cd\u4f5c\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u300cUser\u300d\u3068\u3044\u3046\u540d\u524d\u306e\u30e6\u30fc\u30b6\u30fc \u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3057\u3001Flask-Migrate \u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_migrate import Migrate\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/myapp.db'\ndb = SQLAlchemy(app)\nmigrate = Migrate(app, db)\n\nclass User(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(80), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password = db.Column(db.String(120), nullable=False)\n\n    def __repr__(self):\n        return '&lt;User %r&gt;' % self.username\n\n@app.route('\/')\ndef index():\n    return 'Hello, world!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u300cUser\u300d\u3068\u3044\u3046\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30e2\u30c7\u30eb\u3092\u5b9a\u7fa9\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u3057\u3066SQLite\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u540c\u6642\u306b\u3001Flask-Migrate \u3092\u4f7f\u7528\u3057\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u79fb\u884c\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u5229\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<p>Flask-Login \u3084 Flask-WTF \u306a\u3069\u306e Flask \u62e1\u5f35\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3068\u6a29\u9650\u7ba1\u7406\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001Flask-Login \u3092\u4f7f\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u30ed\u30b0\u30a4\u30f3\u304a\u3088\u3073\u30ed\u30b0\u30a2\u30a6\u30c8\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>from flask import Flask, render_template, request, redirect, url_for, flash\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_login import LoginManager, UserMixin, login_user, logout_user, login_required\nfrom werkzeug.security import generate_password_hash, check_password_hash\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'mysecret'\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/myapp.db'\ndb = SQLAlchemy(app)\nlogin_manager = LoginManager(app)\n\nclass\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc (db.Model\u3001UserMixin): id = db.Column(db.Integer\u3001primary_key=True) \u30e6\u30fc\u30b6\u30fc\u540d = db.Column(db.String(80)\u3001unique=True\u3001nullable=False) email = db.Column( db.String(120), unique=True, nullable=False) password_hash = db.Column(db.String(120), nullable=False)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ruby\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>def set_password(self, password):\n    self.password_hash = generate_password_hash(password)\n\ndef check_password(self, password):\n    return check_password_hash(self.password_hash, password)\n\ndef __repr__(self):\n    return '&lt;User %r&gt;' % self.username\n<\/code><\/pre>\n\n\n\n<p>@login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))<\/p>\n\n\n\n<p>@app.route(&#8216;\/&#8217;) def index(): return &#8216;Hello, world!&#8217;<\/p>\n\n\n\n<p>@app.route(&#8216;\/login&#8217;, methods=[&#8216;GET&#8217;, &#8216;POST&#8217;]) def login(): request.method == &#8216;POST&#8217; \u306e\u5834\u5408: \u30e6\u30fc\u30b6\u30fc\u540d = request.form[&#8216;username&#8217;] \u30d1\u30b9\u30ef\u30fc\u30c9 = \u8981\u6c42.form[&#8216;password&#8217;] remember = request.form.get(&#8216;remember&#8217;)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">scss\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>    user = User.query.filter_by(username=username).first()\n\n    if user and user.check_password(password):\n        login_user(user, remember=remember)\n        return redirect(url_for('dashboard'))\n    else:\n        flash('Invalid username or password')\n\nreturn render_template('login.html')\n<\/code><\/pre>\n\n\n\n<p>@app.route(&#8216;\/dashboard&#8217;) @login_required def dashboard(): return render_template(&#8216;dashboard.html&#8217;)<\/p>\n\n\n\n<p>@app.route(&#8216;\/logout&#8217;) @login_required def logout(): logout_user() return redirect(url_for(&#8216;index&#8217;))<\/p>\n\n\n\n<p>if&nbsp;<strong>name<\/strong>&nbsp;== &#8216;&nbsp;<strong>main<\/strong>&nbsp;&#8216;: app.run(debug=True)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>\n\u8fd9\u91cc\u4f7f\u7528Flask-Login\u5b9e\u73b0\u4e86\u7528\u6237\u767b\u5f55\u3001\u767b\u51fa\u548c\u4fdd\u62a4\u8def\u7531\u7684\u529f\u80fd\u3002\n\n5. API\u8bbe\u8ba1\u548c\u5b9e\u73b0\n\n\u6839\u636e\u9879\u76ee\u9700\u6c42\uff0c\u8bbe\u8ba1API\u63a5\u53e3\u548c\u6570\u636e\u6a21\u578b\uff0c\u5e76\u4f7f\u7528Flask\u6269\u5c55\u5982Flask-RESTful\u6765\u5b9e\u73b0API\u529f\u80fd\u3002\n\n\u4f8b\u5982\uff0c\u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3a\u201cProduct\u201d\u7684\u5546\u54c1\u6a21\u578b\uff0c\u5e76\u4f7f\u7528Flask-RESTful\u5b9e\u73b0\u5546\u54c1API\u63a5\u53e3\uff1a\n\n```python\nfrom flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_restful import Api, Resource, reqparse, fields, marshal_with\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/myapp.db'\ndb = SQLAlchemy(app)\napi = Api(app)\n\nclass Product(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    name = db.Column(db.String(80), unique=True, nullable=False)\n    price = db.Column(db.Float, nullable=False)\n\n    def __repr__(self):\n        return '&lt;Product %r&gt;' % self.name\n\nproduct_fields = {\n    'id': fields.Integer,\n    'name': fields.String,\n    'price': fields.Float\n}\n\nclass ProductResource(Resource):\n    def __init__(self):\n        self.parser = reqparse.RequestParser()\n        self.parser.add_argument('name', type=str, required=True, help='Product name is required')\n        self.parser.add_argument('price', type=float, required=True, help='Product price is required')\n\n    @marshal_with(product_fields)\n    def get(self, product_id):\n        product = Product.query.get(product_id)\n        if product:\n            return product\n        else:\n            return {'message': 'Product not found'}, 404\n\n    @marshal_with(product_fields)\n    def put(self, product_id):\n        product = Product.query.get(product_id)\n        if product:\n            args = self.parser.parse_args()\n            product.name = args['name']\n            product.price = args['price']\n            db.session.commit()\n            return product\n        else:\n            return {'message': 'Product not found'}, 404\n\n    def delete(self, product_id):\n        product = Product.query.get(product_id)\n       \n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u7d9a\u3051\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kotlin\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3059\u308b<code>    if product:\n        db.session.delete(product)\n        db.session.commit()\n        return '', 204\n    else:\n        return {'message': 'Product not found'}, 404\n<\/code><\/pre>\n\n\n\n<p>class ProductListResource(Resource): @marshal_with(product_fields) def get(self): products = Product.query.all() \u5546\u54c1\u3092\u8fd4\u3059<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">less\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>@marshal_with(product_fields)\ndef post(self):\n    args = self.parser.parse_args()\n    product = Product(name=args['name'], price=args['price'])\n    db.session.add(product)\n    db.session.commit()\n    return product, 201\n<\/code><\/pre>\n\n\n\n<p>api.add_resource(ProductListResource, &#8216;\/products&#8217;) api.add_resource(ProductResource, &#8216;\/products\/&nbsp;<a href=\"javascript:void(0)\">int:product_id<\/a>&nbsp;&#8216;)<\/p>\n\n\n\n<p>if&nbsp;<strong>name<\/strong>&nbsp;== &#8216;&nbsp;<strong>main<\/strong>&nbsp;&#8216;: app.run(debug=True)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc<code>\n\u8fd9\u91cc\u4f7f\u7528Flask-RESTful\u5b9e\u73b0\u4e86\u67e5\u8be2\u3001\u65b0\u589e\u3001\u4fee\u6539\u548c\u5220\u9664\u5546\u54c1\u7684API\u63a5\u53e3\u3002\n\n\u4ee5\u4e0a\u662f\u4e00\u4e2a\u5b8c\u6574\u7684Flask\u9879\u76ee\u5b9e\u6218\u6f14\u793a\uff0c\u6d89\u53ca\u5230\u4e86Flask\u7684\u6838\u5fc3\u529f\u80fd\u4ee5\u53ca\u5e38\u7528\u6269\u5c55\u7684\u4f7f\u7528\u3002\u5f53\u7136\uff0c\u4e00\u4e2a\u771f\u5b9e\u7684\u9879\u76ee\u53ef\u80fd\u8fd8\u4f1a\u6d89\u53ca\u5230\u66f4\u591a\u7684\u529f\u80fd\u548c\u6269\u5c55\uff0c\u9700\u8981\u6839\u636e\u5b9e\u9645\u9700\u6c42\u8fdb\u884c\u9009\u62e9\u548c\u5b9e\u73b0\u3002\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/edu.ujhb.org\/?p=1756\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/chat.openai.com\/_next\/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FAGNmyxbwVdnTP0E2eBqDrujRQjV-wFP12Thr4vFgysVv5A%3Ds96-c&amp;w=96&amp;q=75\" alt=\"gun tei\"\/><\/figure>\n\n\n\n<p>\u304a\u3059\u3059\u3081\u306e\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u3068\u9ad8\u5ea6\u306a\u30d1\u30b9\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p>\u63a8\u5968\u3055\u308c\u308b Flask \u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u3068\u9032\u884c\u30d1\u30b9\u3092\u6b21\u306b\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flask \u306e\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8: Flask \u306e\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3001Flask \u3092\u5b66\u7fd2\u3059\u308b\u305f\u3081\u306e\u6700\u3082\u4fe1\u983c\u3067\u304d\u308b\u60c5\u5831\u3067\u3059. \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306f\u3001Flask \u306e\u3059\u3079\u3066\u306e\u5074\u9762\u3092\u8a73\u7d30\u306b\u7d39\u4ecb\u3057\u3066\u3044\u307e\u3059, \u30b3\u30a2\u95a2\u6570\u3068\u62e1\u5f35\u6a5f\u80fd\u306e\u4f7f\u7528\u3092\u542b\u3080.<\/li>\n\n\n\n<li>Flask Mega-Tutorial: \u3053\u308c\u306f\u975e\u5e38\u306b\u512a\u308c\u305f Flask \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u3059. \u4f5c\u6210\u8005\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3001\u30c7\u30d7\u30ed\u30a4\u306a\u3069\u3001Flask \u306e\u3059\u3079\u3066\u306e\u5074\u9762\u3092\u30ab\u30d0\u30fc\u3059\u308b\u5b8c\u5168\u306a Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30bc\u30ed\u304b\u3089\u4f5c\u6210\u3057\u307e\u3059.<\/li>\n\n\n\n<li>Flask Web \u958b\u767a\u30d7\u30e9\u30af\u30c6\u30a3\u30b9: \u3053\u308c\u306f\u975e\u5e38\u306b\u5b9f\u7528\u7684\u306a Flask \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u3059. \u8457\u8005\u306f\u3001Flask \u3092\u4f7f\u7528\u3057\u3066 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u65b9\u6cd5\u3092\u3001Flask \u306e\u30b3\u30a2\u6a5f\u80fd\u3084\u4e00\u822c\u7684\u306a\u62e1\u5f35\u6a5f\u80fd\u306e\u4f7f\u7528\u306a\u3069\u3001\u7c21\u5358\u306a\u7528\u8a9e\u3067\u8aac\u660e\u3057\u3066\u3044\u307e\u3059.<\/li>\n\n\n\n<li>Flasky: \u3053\u308c\u306f\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9\u306e Flask \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002\u4f5c\u6210\u8005\u306f\u3053\u308c\u3092\u30b5\u30f3\u30d7\u30eb\u3068\u3057\u3066\u4f7f\u7528\u3057\u3001Flask \u3092\u4f7f\u7528\u3057\u3066\u30d5\u30a9\u30fc\u30e0\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3001\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3001\u304a\u3088\u3073\u5c55\u958b\u3092\u542b\u3080\u5b8c\u5168\u306a Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3059\u308b\u65b9\u6cd5\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u9ad8\u5ea6\u306a\u30d1\u30b9: Flask \u306e\u57fa\u672c\u3092\u7fd2\u5f97\u3057\u305f\u3089\u3001Flask \u62e1\u5f35\u6a5f\u80fd\u306e\u4f7f\u7528\u3001RESTful API \u8a2d\u8a08\u3001WebSocket \u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316\u306a\u3069\u3001Flask \u306e\u9ad8\u5ea6\u306a\u30c8\u30d4\u30c3\u30af\u3092\u3055\u3089\u306b\u5b66\u7fd2\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>Flask \u62e1\u5f35\u6a5f\u80fd: Flask \u306b\u306f\u3001Flask-WTF\u3001Flask-SQLAlchemy\u3001Flask-Login\u3001Flask-RESTful \u306a\u3069\u3001\u958b\u767a\u4f5c\u696d\u3092\u5927\u5e45\u306b\u7c21\u7d20\u5316\u3067\u304d\u308b\u975e\u5e38\u306b\u4fbf\u5229\u306a\u62e1\u5f35\u6a5f\u80fd\u304c\u591a\u6570\u3042\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d7\u30ed\u30b8\u30a7\u30af\u30c8: \u3044\u304f\u3064\u304b\u306e\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u304b\u3092\u77e5\u308b\u3053\u3068\u306f\u3001Flask \u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3088\u308a\u3088\u304f\u7406\u89e3\u3059\u308b\u306e\u306b\u5f79\u7acb\u3061\u307e\u3059.Flask-Admin\u3001Flask-RESTful\u3001Flask-Uploads \u306a\u3069\u3001GitHub \u3067\u3044\u304f\u3064\u304b\u306e Flask \u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u53c2\u7167\u3067\u304d\u307e\u3059.<\/li>\n<\/ol>\n\n\n\n<p>\u8981\u3059\u308b\u306b\u3001Flask \u3092\u5b66\u7fd2\u3059\u308b\u306b\u306f\u3001\u7d99\u7d9a\u7684\u306a\u7df4\u7fd2\u3068\u7df4\u7fd2\u304c\u5fc5\u8981\u3067\u3059.\u30cb\u30fc\u30ba\u3068\u8208\u5473\u306b\u5fdc\u3058\u3066\u3001\u81ea\u5206\u306b\u5408\u3063\u305f\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u3068\u9ad8\u5ea6\u306a\u30d1\u30b9\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30f3\u30c6\u30f3\u30c4\u306b\u5408\u308f\u305b\u3066\u30a2\u30ec\u30f3\u30b8\u3057\u3066\u3082\u3089\u3048\u307e\u3059 &hellip; <\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_mi_skip_tracking":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-2129","post","type-post","status-publish","format-standard","hentry","category-material"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/posts\/2129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2129"}],"version-history":[{"count":1,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/posts\/2129\/revisions"}],"predecessor-version":[{"id":2130,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=\/wp\/v2\/posts\/2129\/revisions\/2130"}],"wp:attachment":[{"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/edu.ujhb.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}