仕事でPYTHON-FLASKを使ったアプリケーションを作っています。
ほとんどの処理をapp.pyというファイルに入れています。
理由としては、PYTHON自体がIMPORT等を使っても、動作としては
全部読み込んで動くスクリプトなので、特に分割するメリットを感じなかったためです。
ところが、直近になって私本人の移動の話があり、
この理解しにくい、ソースコードを別担当者に引き継ぐ必要が出てきました。
まずはコード自体が長すぎるために、これを短く書く検討を始めています。
そこで添付のようなコードの場合は、どこを、どのように切れば
このようなコード縮小が可能でしょうか?
いまだ未熟者のため、リファクタリングで動かなくなるリスクを懸念して
手が付けられていない状況です。
参考のソースファイルを下記に示します。
実際には、これらの5倍ぐらいのコードがあります。
忌憚のないご意見を頂けましたら幸いです。
python
1#app.py 2 3import os 4import sys 5import io 6import time 7import numpy as np 8import pandas as pd 9import cv2 10from flask import Flask, render_template, request, redirect, url_for, send_from_directory, session, flash, make_response 11import pdb 12import PyPDF2 13import random 14import json 15from flask_sqlalchemy import SQLAlchemy 16from sqlalchemy import create_engine 17from sqlalchemy.orm import sessionmaker 18import sqlite3 19from datetime import datetime 20from werkzeug.utils import secure_filename 21import Fxx_COUNT as fsc 22import secrets 23import logging 24import string 25 26 27LOGFILE = "LOGFILE.log" 28 29app = Flask(__name__) 30 31app.secret_key = 'any random string' 32app.logger.setLevel(logging.DEBUG) 33fh = logging.FileHandler(LOGFILE) 34fh.setLevel(logging.DEBUG) 35app.logger.addHandler(fh) 36 37UPLOAD_FOLDER = './uploads/' 38STRAGE_FOLDER = './strages/' 39TEMP_FOLDER = './temp/' 40STATIC_FOLDER = './static/' 41 42ALLOWED_EXTENSIONS = set(['png', 'jpg', 'PNG', 'JPG', 'pdf']) 43IMAGE_WIDTH = 640 44app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///members.db' 45app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # MCOのオリジナルをアップロードするフォルダ 46app.config['STRAGE_FOLDER'] = STRAGE_FOLDER # 処理済ファイルをアップロードするフォルダ 47app.config['TEMP_FOLDER'] = TEMP_FOLDER # 処理済ファイルをアップロードするフォルダ 48app.config['STATIC_FOLDER'] = STATIC_FOLDER # 処理済ファイルをアップロードするフォルダ 49app.config['SECRET_KEY'] = os.urandom(24) 50PATTERN_FILE = "Fxx.png" 51 52#db = SQLAlchemy() 53# db.init_app(app) 54 55 56def allowed_file(filename): 57 return '.' in filename and \ 58 filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 59 60# members.dbから、CUSTOMERSを読み込んで、VARへ挿入する 61@app.route('/customer') 62def customer(): 63 conn = sqlite3.connect(app.config['DATABASE']) 64 cur = conn.cursor() 65 cur.execute("SELECT * FROM customers") 66 var = cur.fetchall() 67 conn.close() 68 return render_template('customer.html', var=var) 69 70# items sign up 71@app.route('/customer_signed_up', methods=['GET', 'POST']) 72def customer_signed_up(): 73 # pdb.set_trace() 74 session['username'] = request.form['username'] 75 password = request.form['password'] 76 conn = sqlite3.connect(app.config['DATABASE']) 77 cur = conn.cursor() 78 cur.execute("INSERT INTO customers(username,password) VALUES (?,?)", 79 (session['username'], password)) 80 conn.commit() 81 conn.close() 82 return redirect(url_for('logout')) 83 84# items delete 85@app.route('/customer_delete', methods=['GET', 'POST']) 86def customer_delete(): 87 session['username'] = request.form['username'] 88 password = request.form['password'] 89 conn = sqlite3.connect(app.config['DATABASE']) 90 cur = conn.cursor() 91 cur.execute("delete from customers where username=?", (session['username'],)) 92 cur.execute("delete from response where username=?", (session['username'],)) 93 cur.execute("delete from response2 where username=?", (session['username'],)) 94 conn.commit() 95 conn.close() 96 return redirect(url_for('logout')) 97 98# ログイン処理 ← SESSION変数にログインしたユーザーの名前が入る 99@app.route('/customer_logged_in', methods=['GET', 'POST']) 100def customer_logged_in(): 101 session['username'] = request.form['username'] 102 dir1=os.path.join(app.config['UPLOAD_FOLDER'],session['username']) 103 if not os.path.exists(dir1): 104 os.mkdir(dir1) 105 106 app.logger.info('%s logged in successfully', session['username']) 107 return redirect(url_for('homepage_customer')) 108 109# メインページへの誘導のため、データベースのテーブルを呼び出す 110@app.route('/') 111@app.route('/homepage_customer') 112def homepage_customer(): 113 if 'username' in session: 114 conn = sqlite3.connect(app.config['DATABASE']) 115 cur = conn.cursor() 116 cur.execute("SELECT * FROM response WHERE username=? order by url asc" , 117 (session['username'],)) 118 response = cur.fetchall() 119 cur.execute("SELECT * FROM response2 WHERE username=?", 120 (session['username'],)) 121 response2 = cur.fetchall() 122 conn.close() 123 124 image = {} 125 my_images = [] # イメージ画像の辞書 126 127 for id, name, file1, number, sender in response: 128 if file1.endswith('.png'): 129 image['url'] = file1 130 image['id']=id 131 image['message']=number 132 if sender == 0: 133 sender = 0 134 elif not sender: 135 sender = -1 136 image['sender']=sender 137 my_images.append(image.copy()) 138 139 pimage = {} 140 p_images = [] 141 142 for id,name, file2, sel ,dum,dum in response2: 143 if file2.endswith('.png'): 144 pimage['id'] = id 145 pimage['url'] = file2 146 p_images.append(pimage.copy()) 147 148 return render_template('index.html', items=my_images, p_items=p_images, USER=session['username']) 149 return redirect('customer') 150 151@app.route('/logout') 152def logout(): 153 # remove the username from the session if its there 154 session.pop('username', None) 155 return redirect('/') 156 157# サーバーへPDFをアップロードする 158@app.route('/send', methods=['GET', 'POST']) 159def send(): 160 if request.method == 'POST': 161 img_file = request.files['img_file'] 162 if img_file and img_file.filename.endswith('.pdf'): 163 #pdb.set_trace() 164 saveFileName = path_( app.config['UPLOAD_FOLDER'],session['username'], secure_filename(img_file.filename)) 165 if os.path.isfile(saveFileName): 166 flash('ファイル名が重複しています。重複しないページのみを更新します。') 167 else: 168 img_file.save(saveFileName) 169 else: 170 flash('pdfファイルではありません') 171 saveFileName = "" 172 return render_template('index.html', upload_img_url=saveFileName) 173 else: 174 return redirect('/') 175 176def path_(a,b,c): 177 d= os.path.join(a,b) 178 return os.path.join(d,c) 179 180# サーバーへPattern をアップロードする 181@app.route('/pattern', methods=['GET', 'POST']) 182def pattern(): 183 if request.method == 'POST': 184 img_file = request.files['img_file'] 185 if img_file and img_file.filename.endswith('.png'): 186 saveFileName = os.path.join( 187 app.config['UPLOAD_FOLDER'], datetime.now().strftime("%Y%m%d_%H%M%S_")+secure_filename(img_file.filename)) 188 if os.path.isfile(saveFileName): 189 flash('ファイル名が重複しています') 190 saveFileName = "" 191 else: 192 img_file.save(saveFileName) 193 conn = sqlite3.connect(app.config['DATABASE']) 194 cur = conn.cursor() 195 cur.execute("INSERT INTO response2(username,url,choose,circle,line) VALUES (?,?,?,?,?)", 196 (session['username'], saveFileName, 1 , 10 , 6 )) 197 conn.commit() 198 conn.close() 199 else: 200 flash('pngファイルではありません') 201 saveFileName = "" 202 return redirect('/') 203 else: 204 return redirect('/') 205 206 207 208中略 209 210##python app nonx ---> Format for Non-X without Fxx/Sxx 211##python app ---> Format for X with Fxx/Sxx 212 213if __name__ == '__main__': 214 app.config['USE_FxxSxx_NOTATION'] = True 215 app.config['PORT']='8080' 216 app.config['DATABASE']='members.db' 217 app.config['ADMIN_PASS']="xxxx" ## X-USER 218 219 if len(sys.argv)>=2: 220 if sys.argv[1]=="nonx": 221 app.config['USE_FxxSxx_NOTATION'] = False 222 app.config['PORT'] = '8888' 223 app.config['DATABASE']='members2.db' 224 app.config['ADMIN_PASS']="xxxx" ## NONX-USER 225 app.run('localhost', port=app.config['PORT'] ,debug=True)
回答4件
あなたの回答
tips
プレビュー