Falsk项目实践与开源贡献(第十一阶段)

目录

  • 项目实践与开源贡献
    • [1. 实践项目:构建个人博客](#1. 实践项目:构建个人博客)
      • [1.1 项目结构](#1.1 项目结构)
      • [1.2 环境配置](#1.2 环境配置)
      • [1.3 数据模型设计](#1.3 数据模型设计)
      • [1.4 用户注册和登录功能](#1.4 用户注册和登录功能)
      • [1.5 文章管理功能](#1.5 文章管理功能)
        • [在 app.py 中实现文章的列表与创建功能](#在 app.py 中实现文章的列表与创建功能)
      • [1.6 运行应用](#1.6 运行应用)
    • [2. 开源贡献](#2. 开源贡献)
      • [2.1 找到开源项目](#2.1 找到开源项目)
      • [2.2 克隆项目并设置开发环境](#2.2 克隆项目并设置开发环境)
      • [2.3 进行修改和提交](#2.3 进行修改和提交)
      • [2.4 创建新分支和推送](#2.4 创建新分支和推送)
      • [2.5 提交 Pull Request](#2.5 提交 Pull Request)
      • [2.6 代码审查](#2.6 代码审查)
    • [3. 结论](#3. 结论)

项目实践与开源贡献

在这一阶段,我们将学习如何构建一个完整的应用项目,比如个人博客,TOD0管理工具等,并参与开源贡献。以下是本教程的详细内容,涵盖如何实现用户注册、登录和数据展示等功能,并展示如何参与开源项目。

1. 实践项目:构建个人博客

1.1 项目结构

首先,我们需要搭建一个基本的项目结构,包含核心模块如用户认证、博客文章管理等。

blog_app/
    ├── app.py
    ├── models.py
    ├── forms.py
    ├── templates/
    │   ├── layout.html
    │   ├── index.html
    │   ├── login.html
    │   ├── register.html
    │   └── post.html
    ├── static/
    │   └── styles.css
    └── instance/
        └── config.py

1.2 环境配置

使用 flaskflask_sqlalchemy 创建项目的环境。确保安装必要的库:

bash 复制代码
pip install Flask Flask-SQLAlchemy Flask-WTF Flask-Login

1.3 数据模型设计

models.py

models.py 中定义用户和博客文章模型:

python 复制代码
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from app import app

db = SQLAlchemy(app)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True, nullable=False)
    password = db.Column(db.String(150), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(150), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

1.4 用户注册和登录功能

forms.py

定义用于用户注册和登录的表单:

python 复制代码
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=150)])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Sign Up')

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')
app.py
python 复制代码
from flask import Flask, render_template, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_user, UserMixin, login_required, logout_user, login_manager
from forms import RegistrationForm, LoginForm
from models import db, User

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db.init_app(app)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        flash('Account created!', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user and user.password == form.password.data:
            login_user(user)
            return redirect(url_for('index'))
        else:
            flash('Login failed. Check username and password', 'danger')
    return render_template('login.html', form=form)

@app.route('/')
@login_required
def index():
    return render_template('index.html', title='Home')

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

1.5 文章管理功能

为模型添加 CRUD 操作,展示博客文章。

app.py 中实现文章的列表与创建功能
python 复制代码
@app.route('/post/new', methods=['GET', 'POST'])
@login_required
def new_post():
    form = PostForm()
    if form.validate_on_submit():
        post = Post(title=form.title.data, content=form.content.data, user_id=current_user.id)
        db.session.add(post)
        db.session.commit()
        flash('Your post has been created!', 'success')
        return redirect(url_for('index'))
    return render_template('create_post.html', form=form)

@app.route('/post/<int:post_id>')
def post(post_id):
    post = Post.query.get_or_404(post_id)
    return render_template('post.html', title=post.title, post=post)

1.6 运行应用

创建数据库:

bash 复制代码
flask shell
>>> from models import db
>>> db.create_all()

运行项目:

bash 复制代码
python app.py

打开浏览器访问 http://127.0.0.1:5000/

2. 开源贡献

2.1 找到开源项目

  1. 在 GitHub 上搜索感兴趣的项目,查看项目的问题(Issues)。
  2. 找到标记为"good first issue"或"help wanted"的项。

2.2 克隆项目并设置开发环境

bash 复制代码
git clone <repo-url>
cd <repo>

查看 README.md 文件,了解项目的构建和依赖。

2.3 进行修改和提交

  1. 在本地进行修改(例如修复 bug,添加功能)。
  2. 提交更改:
bash 复制代码
git add .
git commit -m "Fix issue with user login"

2.4 创建新分支和推送

创建新分支可以保持你的工作组织良好:

bash 复制代码
git checkout -b feature/new-feature
git push origin feature/new-feature

2.5 提交 Pull Request

  1. 在 GitHub 上找到项目,点击 "Pull requests" 选项卡。
  2. 点击 "New pull request",选择你的分支,并描述你所做的更改。

2.6 代码审查

参与代码审查过程,等待维护者的反馈,可能需要根据反馈进行修改。

3. 结论

通过本教程,你已经学习了如何构建一个简单的个人博客应用,并了解了如何参与开源项目。参与开源不仅能提升你的编码能力,还能让你与全球开发者互动,共同推动技术的发展。希望你能在实践项目中不断探索,取得更好的成就!

相关推荐
Estar.Lee1 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
LateBloomer7777 分钟前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz11 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py12 分钟前
【Linux】-学习笔记04
linux·笔记·学习
drebander23 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
新知图书43 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
weiabc1 小时前
学习electron
javascript·学习·electron
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang1 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net