Sure, here's the complete `app.py` file:
```python
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_login import LoginManager, login_user, current_user, logout_user, login_required
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import User, Income, Expense, ZakatDue, ZakatPaid
from hijri_converter import HijriDate

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'

# configure database connection
engine = create_engine('sqlite:///zakat_calculator.db', echo=True)
Session = sessionmaker(bind=engine)

# setup login manager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

# define login manager loader function
@login_manager.user_loader
def load_user(user_id):
    session = Session()
    user = session.query(User).filter_by(id=int(user_id)).first()
    session.close()
    return user

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    if request.method == 'POST':
        email = request.form['email']
        password = request.form['password']
        session = Session()
        user = session.query(User).filter_by(email=email).first()
        if user and user.check_password(password):
            login_user(user)
            session.close()
            return redirect(url_for('home'))
        else:
            flash('Invalid email or password')
            session.close()
    return render_template('login.html')

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

@app.route('/register', methods=['GET', 'POST'])
def register():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    if request.method == 'POST':
        name = request.form['name']
        email = request.form['email']
        password = request.form['password']
        session = Session()
        user = User(name=name, email=email)
        user.set_password(password)
        session.add(user)
        session.commit()
        session.close()
        flash('Registration successful. Please login.')
        return redirect(url_for('login'))
    return render_template('register.html')

@app.route('/home', methods=['GET', 'POST'])
@login_required
def home():
    session = Session()
    user_id = current_user.id

    # handle income form submission
    if request.method == 'POST' and request.form['type'] == 'income':
        amount = float(request.form['amount'])
        date = datetime.strptime(request.form['date'], '%Y-%m-%d').date()
        income = Income(amount=amount, date=date, user_id=user_id)
        session.add(income)
        session.commit()
        flash('Income added successfully.')

    # handle expense form submission
    if request.method == 'POST' and request.form['type'] == 'expense':
        amount = float(request.form['amount'])
        date = datetime.strptime(request.form['date'], '%Y-%m-%d').date()
        expense = Expense(amount=amount, date=date, user_id=user_id)
        session.add(expense)
        session.commit()
        flash('Expense added successfully.')

    # get current year and calculate hijri year
    current_year = datetime.now().year
    hijri_date = HijriDate.today()
    hijri_year = hijri_date.year

    # get incomes and expenses for current user
    incomes = session.query(Income).filter_by(user_id=user_id).order_by(Income.date
```
물론, 여기 전체 `app.py` 파일이 있습니다:```pythonflask에서 플라스크, 렌더_템플릿, 요청, 리디렉션, url_for, flash를 가져옵니다.flask_login에서 LoginManager, login_user, current_user, logout_user, login_required를 import합니다.from datetime import datetimesqlalchemy에서 create_engine importsqlalchemy.orm에서 세션메이커를 가져옵니다.models에서 사용자, 소득, 비용, ZakatDue, ZakatPaid를 가져옵니다.hijri_converter에서 HijriDate를 가져옵니다.app = 플라스크(__name__)app.config['SECRET_KEY'] = 'secret_key'# 데이터베이스 연결 구성engine = create_engine('sqlite:///zakat_calculator.db', echo=True)세션 = 세션메이커(바인드=엔진)# 로그인 관리자 설정login_manager = LoginManager()login_manager.init_app(app)login_manager.login_view = 'login'# 로그인 매니저 로더 함수 정의login_manager.user_loaderdef load_user(user_id):    세션 = 세션()    user = session.query(User).filter_by(id=int(user_id)).first()    session.close()    반환 사용자@app.route('/')def index():    return redirect(url_for('login'))app.route('/login', methods=['GET', 'POST'])def login():    if current_user.is_authenticated:        return redirect(url_for('home'))    request.method == 'POST':        email = request.form['email']        password = request.form['password']        세션 = 세션()        user = session.query(User).filter_by(email=email).first()        사용자 및 사용자.check_password(비밀번호):            login_user(user)            session.close()            return redirect(url_for('home'))        else:            flash('잘못된 이메일 또는 비밀번호')            session.close()    return render_template('login.html')app.route('/로그아웃')로그인_필요def logout():    logout_user()    return redirect(url_for('login'))app.route('/register', methods=['GET', 'POST'])def register():    if current_user.is_authenticated:        return redirect(url_for('home'))    request.method == 'POST':        name = request.form['name']        이메일 = request.form['이메일']        password = request.form['password']        세션 = 세션()        user = 사용자(이름=이름, 이메일=이메일)        user.set_password(password)        세션.추가(사용자)        세션.커밋()        session.close()        flash('등록이 성공했습니다. 로그인하세요.')        return redirect(url_for('login'))    반환 렌더_템플릿('register.html')app.route('/home', methods=['GET', 'POST'])login_requireddef home():    세션 = 세션()    user_id = current_user.id    # 소득 양식 제출 처리    요청.메소드가 'POST' 이고 요청.양식['type'] == 'income' 인 경우:        amount = float(request.form['amount'])        date = datetime.strptime(request.form['date'], '%Y-%m-%d').date()        소득 = 소득(금액=금액, 날짜=날짜, 사용자_아이디=사용자_아이디)        세션.추가(소득)        세션.커밋()        flash('수입이 성공적으로 추가되었습니다.')    # 비용 양식 제출 처리    요청.메소드가 'POST' 이고 요청.양식['유형'] == '비용' 인 경우:        amount = float(request.form['amount'])        date = datetime.strptime(request.form['date'], '%Y-%m-%d').date()        비용 = 비용(금액=금액, 날짜=날짜, 사용자_id=사용자_id)        세션.추가(비용)        세션.커밋()        flash('비용이 성공적으로 추가되었습니다.')    # 현재 연도를 가져와 양력 연도 계산하기    current_year = datetime.now().year    hijri_date = HijriDate.today()    hijri_year = hijri_date.year    # 현재 사용자의 수입과 지출 가져오기    incomes = session.query(Income).filter_by(user_id=user_id).order_by(Income.date```