利用Flask开发一个Web程序

开发环境 : Linux系统,语言: Python,Html, Css

利用Flask实现一个WatchList的Web程序,部分代码和图片都是来自:Flask 入门教程,我在此基础上修改了一下,最后的效果如下:

caba117169304e2f964eaff22b5f7df4.png

1. 安装 Flask和一些基本插件

pip install flask
pip install Flask-SQLAlchemy
pip install pymysql

如果安装比较慢的话,可以加上 -i https://pypi.tsinghua.edu.cn/simple

2. 创建项目结构

创建一个文件夹来存放你的项目文件。项目的基本结构如下:

WatchList/{static/images style.css} {template/index.html login.html} app.py

3.在WatchList目录下创建虚拟环境并进入虚拟环境

python3 -m venv env
scoure ./env/Scripts/activate

4. 编写主应用文件 (app.py)

WatchList目录下创建一个名为 app.py 的文件,并编写以下代码:

from flask import Flask, render_template, url_for, redirect, request, flash
from flask_sqlalchemy import SQLAlchemy
import click

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/watchlist'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'your_secret_key'  # 用于闪现消息

db = SQLAlchemy(app)

# 创建数据库命令
@app.cli.command()
def forge():
    """Generate fake data."""
    db.create_all()

    name = 'BrokenOfViolet'
    movies = [
        {'title': 'My Neighbor Totoro', 'year': '1988'},
        {'title': 'Dead Poets Society', 'year': '1989'},
        {'title': 'A Perfect World', 'year': '1993'},
        {'title': 'Leon', 'year': '1994'},
        {'title': 'Mahjong', 'year': '1996'},
        {'title': 'Swallowtail Butterfly', 'year': '1996'},
        {'title': 'King of Comedy', 'year': '1999'},
        {'title': 'Devils on the Doorstep', 'year': '1999'},
        {'title': 'WALL-E', 'year': '2008'},
        {'title': 'The Pork of Music', 'year': '2012'},
    ]

    user = User(username=name, password='password123')  # 设定一个默认密码
    db.session.add(user)
    for m in movies:
        movie = Movie(title=m['title'], year=m['year'])
        db.session.add(movie)

    db.session.commit()
    click.echo('Done.')

# 数据库模型
class User(db.Model):
    username = db.Column(db.String(20), primary_key=True)
    password = db.Column(db.String(20))

class Movie(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(60))
    year = db.Column(db.String(4))

# 主页路由
@app.route('/')
def index():
    user = User.query.first()  # 修复此处变量名
    movies = Movie.query.all()
    return render_template("index.html", user=user, movies=movies)

# 404 错误处理路由
@app.errorhandler(404)
def page_not_found(e):
    user = User.query.first()
    return render_template('404.html', user=user), 404

# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()

        # 比对用户输入的密码和数据库中存储的密码
        if user and user.password == password:
            flash('Login successful!', 'success')
            return redirect(url_for('index'))  # 假设登录成功后重定向到index
        else:
            flash('Invalid username or password.', 'danger')

    return render_template('login.html')

if __name__ == '__main__':
    app.run(debug=True)
 

5. 创建 HTML 模板文件

  • 主页templates/index.html

 在 templates 目录中创建一个名为 index.html 的文件,编写一个简单的 HTML 页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="{{url_for('static',filename='style.css')}}" type="text/css">
    <title>{{ name }}'s Watchlist</title>
</head>
<body>
    <h2>{{ name }}'s Watchlist
        <img alt="Avatar" class="avator" src="{{url_for('static',filename='images/avatar.png')}}">
    </h2>
    {# 使用 length 过滤器获取 movies 变量的长度 #}
    <p>{{ movies|length }} Titles</p>
    <ul class="movie-list">
        {% for movie in movies %}  {# 迭代 movies 变量 #}
        <li>{{ movie.title }} - {{ movie.year }}</li>  {# 等同于 movie['title'] #}
        {% endfor %}  {# 使用 endfor 标签结束 for 语句 #}
    </ul>
    <img alt="Totoro" class="totoro" src="{{url_for('static',filename='images/totoro.gif')}}"
</body>
</html>
  • 登陆界面templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <div class="login-container">
        <h2>Login</h2>
        {% with messages = get_flashed_messages(with_categories=true) %}
          {% if messages %}
            <ul class="flashes">
              {% for category, message in messages %}
                <li class="{{ category }}">{{ message }}</li>
              {% endfor %}
            </ul>
          {% endif %}
        {% endwith %}
        <form method="post" action="{{ url_for('login') }}">
            <div class="input-group">
                <label for="username">Username</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="input-group">
                <label for="password">Password</label>
                <input type="password" id="password" name="password" required>
            </div>
            <button type="submit">Login</button>
        </form>
    </div>
</body>
</html>

6. 创建静态文件 (static/style.css)

static 目录中创建一个名为 style.css 的文件,添加一些简单的 CSS 样式:

/* 页面整体 */
body {
    font-family: Arial, sans-serif;
    background-color: #f0f0f0;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
}

/* 页脚 */
footer {
    color: #888;
    margin-top: 15px;
    text-align: center;
    padding: 10px;
}

/* 头像 */
.avatar {
    width: 40px;
}

/* 电影列表 */
.movie-list {
    list-style-type: none;
    padding: 0;
    margin-bottom: 10px;
    box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}

.movie-list li {
    padding: 12px 24px;
    border-bottom: 1px solid #ddd;
}

.movie-list li:last-child {
    border-bottom:none;
}

.movie-list li:hover {
    background-color: #f8f9fa;
}

/* 龙猫图片 */
.totoro {
    display: block;
    margin: 0 auto;
    height: 100px;
}

.login-container {
    background-color: white;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    width: 300px;
    text-align: center;
}

h2 {
    margin-bottom: 20px;
}

.input-group {
    margin-bottom: 15px;
    text-align: left;
}

.input-group label {
    display: block;
    margin-bottom: 5px;
}

.input-group input {
    width: 100%;
    padding: 8px;
    box-sizing: border-box;
}

button {
    width: 100%;
    padding: 10px;
    background-color: #007BFF;
    color: white;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 16px;
}

button:hover {
    background-color: #0056b3;
}

.flashes {
    list-style-type: none;
    padding: 0;
}

.flashes li {
    padding: 10px;
    margin-bottom: 10px;
    border-radius: 5px;
}

.flashes li.success {
    background-color: #d4edda;
    color: #155724;
}

.flashes li.danger {
    background-color: #f8d7da;
    color: #721c24;
}

 

6. 运行应用

在终端中,导航到 WatchList 目录并运行应用。因为在app.py中定义了forge函数用于提交数据,所以进行如下操作:

flask forge

最后直接运行 app.py 或者执行 flask run

89735913afa2467c9144963488c73235.png

 

 

Flask一个基于Python的微型Web框架,它可以帮助我们快速地开发Web应用程序。下面是使用Flask进行Web开发的基本步骤: 1. 安装Flask:可以通过pip安装Flask,命令为`pip install flask`。 2. 创建Flask应用程序:在Python文件中,使用以下代码来创建一个Flask应用程序: ```python from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run() ``` 这个应用程序定义了一个根路由`/`,当用户访问该路由时,会返回一个字符串`Hello, World!`。 3. 运行Flask应用程序:在Python文件所在的目录下,运行以下命令来启动Flask应用程序: ``` flask run ``` 运行成功后,访问`http://127.0.0.1:5000`即可看到`Hello, World!`的输出。 4. 添加路由和视图函数:可以使用`@app.route`装饰器来为应用程序添加路由。例如,以下代码定义了一个名为`hello`的路由和视图函数: ```python @app.route('/hello') def hello(): return 'Hello, Flask!' ``` 当用户访问`/hello`路由时,会调用`hello()`函数并返回`Hello, Flask!`。 5. 使用模板:在Flask中,可以使用模板来渲染动态内容。可以使用Jinja2模板引擎来为Flask应用程序添加模板功能。例如,以下代码使用模板来渲染一个HTML页面: ```python from flask import render_template @app.route('/hello/<name>') def hello_name(name): return render_template('hello.html', name=name) ``` 当用户访问`/hello/<name>`路由时,会调用`hello_name()`函数并渲染`hello.html`模板,模板中可以使用变量`name`。 以上是使用Flask进行Web开发的基本步骤,根据需求可以继续添加路由、视图函数和模板等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值