App下載

后端開發(fā)項(xiàng)目:入門級(jí)實(shí)踐

伸手挽明月 2023-06-16 13:53:45 瀏覽數(shù) (2085)
反饋

當(dāng)今互聯(lián)網(wǎng)行業(yè)中,后端開發(fā)是一個(gè)非常重要而且富有挑戰(zhàn)性的領(lǐng)域。對(duì)于初學(xué)者來說,入門級(jí)的后端開發(fā)項(xiàng)目實(shí)踐可以幫助他們更好地了解后端開發(fā)的基礎(chǔ)知識(shí)和技能,并為以后深入學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。

本文將介紹一個(gè)簡(jiǎn)單明了的后端開發(fā)項(xiàng)目,著重講解實(shí)現(xiàn)過程中所需掌握的技術(shù)和知識(shí)點(diǎn),幫助讀者快速上手。

1. 項(xiàng)目概述

本項(xiàng)目的目標(biāo)是構(gòu)建一個(gè)基于Web的留言板應(yīng)用程序。用戶可以在應(yīng)用程序中發(fā)布留言、查看留言列表以及刪除留言等功能。該應(yīng)用程序的后端主要由以下幾個(gè)模塊組成:

  • 用戶認(rèn)證模塊
  • 留言管理模塊
  • 數(shù)據(jù)庫(kù)模塊

本項(xiàng)目使用Python語(yǔ)言進(jìn)行開發(fā),采用Flask框架作為Web應(yīng)用程序的基礎(chǔ)框架,并使用Sqlite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。

2. 技術(shù)棧

在本項(xiàng)目中,我們需要使用以下技術(shù)和工具:

  • Python編程語(yǔ)言
  • Flask Web框架
  • HTML/CSS/JavaScript前端開發(fā)技術(shù)
  • Sqlite數(shù)據(jù)庫(kù)

在開始項(xiàng)目之前,需要確保已經(jīng)安裝了以上所有技術(shù)和工具。

3. 實(shí)現(xiàn)步驟

步驟1:創(chuàng)建Flask應(yīng)用程序

首先,我們需要?jiǎng)?chuàng)建一個(gè)基于Flask框架的Web應(yīng)用程序??梢栽诮K端中執(zhí)行以下命令:

mkdir message_board
cd message_board pip install flask touch app.py

接著,在app.py文件中編寫以下代碼,創(chuàng)建一個(gè)名為message_board的Flask應(yīng)用程序:

from flask import Flask, render_template
app = Flask(__name__) @app.route('/') def index(): return "Hello, World!" if __name__ == '__main__': app.run()

執(zhí)行flask run命令,啟動(dòng)Flask開發(fā)服務(wù)器,并在瀏覽器中輸入http://localhost:5000/,即可看到"Hello, World!"的輸出。

步驟2:創(chuàng)建數(shù)據(jù)庫(kù)模型

接下來,需要?jiǎng)?chuàng)建一個(gè)Sqlite數(shù)據(jù)庫(kù),并定義留言板應(yīng)用程序的數(shù)據(jù)模型??梢栽赼pp.py文件中添加以下代碼:

import sqlite3
from flask import g DATABASE = 'message_board.db' def get_db(): db = getattr(g, '_database', None) if db is None: db = g._database = sqlite3.connect(DATABASE) db.row_factory = sqlite3.Row return db @app.teardown_appcontext def close_connection(exception): db = getattr(g, '_database', None) if db is not None: db.close() def init_db(): with app.app_context(): db = get_db() with app.open_resource('schema.sql', mode='r') as f: db.cursor().executescript(f.read()) db.commit() @app.cli.command('initdb') def initdb_command(): init_db() print('Initialized the database.')

以上代碼創(chuàng)建了一個(gè)名為message_board.db的Sqlite數(shù)據(jù)庫(kù),并在app.py文件所在目錄下增加了一個(gè)名為schema.sql的SQL腳本文件,用于定義留言板應(yīng)用程序的數(shù)據(jù)模型。

步驟3:實(shí)現(xiàn)用戶認(rèn)證模塊

接著,需要實(shí)現(xiàn)用戶認(rèn)證模塊。具體來說,我們需要編寫以下幾個(gè)路由函數(shù):

  • 注冊(cè)用戶(/register)
  • 登錄用戶(/login)
  • 退出登錄(/logout)

可以在app.py文件中添加以下代碼,實(shí)現(xiàn)用戶認(rèn)證模塊:

from flask import Flask, render_template, request, session, redirect, url_for, flash
app = Flask(__name__) app.secret_key = 'secret key' ... @app.route('/register', methods=['GET', 'POST']) def register():

    if request.method == 'POST':

        username = request.form['username']

        password = request.form['password']

        db = get_db()

        error = None

        if not username:

            error = 'Username is required.'

        elif not password:

            error = 'Password is required.'

        elif db.execute(

            'SELECT id FROM users WHERE username = ?', (username,)

        ).fetchone() is not None:

            error = f'User {username} is already registered.'

        if error is None:

            db.execute(

                'INSERT INTO users (username, password) VALUES (?, ?)',

                (username, generate_password_hash(password))

            )

            db.commit()

            flash('You were successfully registered. Please login.')

            return redirect(url_for('login'))

        flash(error)

    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])

def login():

    if request.method == 'POST':

        username = request.form['username']

        password = request.form['password']

        db = get_db()

        error = None

        user = db.execute(

            'SELECT * FROM users WHERE username = ?', (username,)

        ).fetchone()

        if user is None:

            error = 'Incorrect username.'

        elif not check_password_hash(user['password'], password):

            error = 'Incorrect password.'

        if error is None:

            session.clear()

            session['user_id'] = user['id']

            flash('You were successfully logged in.')

            return redirect(url_for('index'))

        flash(error)

    return render_template('login.html')

@app.route('/logout')

def logout():

    session.clear()

    flash('You were successfully logged out.')

    return redirect(url_for('index'))

以上代碼使用Flask的session模塊,實(shí)現(xiàn)了用戶注冊(cè)、登錄和退出登錄等功能。其中,注冊(cè)用戶時(shí)需要驗(yàn)證用戶名和密碼是否符合要求,并通過生成哈希值的方式將密碼加密存儲(chǔ);登錄時(shí)需要驗(yàn)證用戶輸入的用戶名和密碼是否正確,并將用戶ID存儲(chǔ)在session中,以便后續(xù)判斷用戶是否已經(jīng)登錄。

步驟4:實(shí)現(xiàn)留言管理模塊

接下來,需要實(shí)現(xiàn)留言管理模塊。具體來說,我們需要編寫以下幾個(gè)路由函數(shù):

  • 查看留言列表(/messages)
  • 發(fā)布新留言(/new_message)
  • 刪除留言(/delete_message)

可以在app.py文件中添加以下代碼,實(shí)現(xiàn)留言管理模塊:

...
@app.route('/messages') def messages(): db = get_db() messages = db.execute( 'SELECT * FROM messages ORDER BY created_at DESC' ).fetchall() return render_template('messages.html', messages=messages) @app.route('/new_message', methods=['GET', 'POST']) def new_message(): if 'user_id' not in session: flash('Please login first.') return redirect(url_for('login')) if request.method == 'POST': content = request.form['content'] error = None if not content: error = 'Content is required.' if error is None: db = get_db() db.execute( 'INSERT INTO messages (content, user_id) VALUES (?, ?)', (content, session['user_id']) ) db.commit() flash('Your message was successfully posted.') return redirect(url_for('messages')) flash(error) return render_template('new_message.html') @app.route('/delete_message/<int:message_id>', methods=['POST']) def delete_message(message_id): if 'user_id' not in session: flash('Please login first.') return redirect(url_for('login')) db = get_db() message = db.execute( 'SELECT * FROM messages WHERE id = ? AND user_id = ?', (message_id, session['user_id']) ).fetchone() if message is None: flash('You are not authorized to delete this message.') else: db.execute('DELETE FROM messages WHERE id = ?', (message_id,)) db.commit() flash('The message was successfully deleted.') return redirect(url_for('messages'))

以上代碼使用Sqlite數(shù)據(jù)庫(kù)存儲(chǔ)留言數(shù)據(jù),并通過Flask路由函數(shù)實(shí)現(xiàn)了查看留言列表、發(fā)布新留言和刪除留言等功能。其中,發(fā)布新留言時(shí)需要驗(yàn)證用戶是否已經(jīng)登錄;刪除留言時(shí)需要驗(yàn)證當(dāng)前用戶是否有權(quán)限刪除該留言。

步驟5:完善前端界面

最后,我們需要完善前端界面,使之更加美觀和易用??梢栽趖emplates目錄下創(chuàng)建以下HTML模板文件:

  • base.html:定義網(wǎng)頁(yè)的基本布局和樣式。
  • index.html:展示網(wǎng)站首頁(yè)的內(nèi)容。
  • register.html:展示用戶注冊(cè)頁(yè)面的內(nèi)容。
  • login.html:展示用戶登錄頁(yè)面的內(nèi)容。
  • messages.html:展示留言列表頁(yè)面的內(nèi)容。
  • new_message.html:展示發(fā)布新留言頁(yè)面的內(nèi)容。

可以參考以下代碼,編寫HTML模板文件:

<!-- templates/base.html -->
<!DOCTYPE html> <html> <head> <title>Message Board</title> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"> </head> <body> <nav> <ul> {% if session.user_id %} <li><a href="{{ url_for('logout') }}">Logout</a></li> {% else %} <li><a href="{{ url_for('login') }}">Login</a></li> <li><a href="{{ url_for('register') }}">Register</a></li> {% endif %} <li><a href="{{ url_for('messages') }}">Messages</a></li> <li><a href="{{ url_for('new_message') }}">New Message</a></li> </ul> </nav> {% with messages = get_flashed_messages() %} {% if messages %} <ul class="flashes"> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} {% endwith %} <main>{% block content %}{% endblock %}</main> </body> </html>
<!-- templates/index.html -->
{% extends "base.html" %} {% block content %} <h1>Welcome to Message Board!</h1> {% endblock %}
<!-- templates/register.html -->
{% extends "base.html" %} {% block content %} <h1>Register</h1> <form method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username"> <label for="password">Password:</label> <input type="password" id="password" name="password"> <input type="submit" value="Register"> </form> {% endblock %}
<!-- templates/login.html -->
{% extends "base.html" %} {% block content %} <h1>Login</h1> <form method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username"> <label for="password">Password:</label> <input type="password" id="password" name="password"> <input type="submit" value="Login"> </form> {% endblock %}
<!-- templates/messages.html -->
{% extends "base.html" %} {% block content %} <h1>Messages</h1> {% for message in messages %} <article> <p>{{ message['content'] }}</p> <p>Posted by {{ message['username'] }} on {{ message['created_at'] }}</p> {% if session.user_id == message['user_id'] %} <form method="post" action="{{ url_for('delete_message', message_id=message['id']) }}"> <button>Delete</button> </form> {% endif %} </article> {% else %} <p>No messages yet. Be the first to post!</p> {% endfor %} {% endblock %}
<!-- templates/new_message.html -->
{% extends "base.html" %} {% block content %} <h1>New Message</h1> <form method="post"> <label for="content">Content:</label> <textarea id="content" name="content"></textarea> <input type="submit" value="Post"> </form> {% endblock %}

以上HTML模板文件使用了Flask的模板引擎,實(shí)現(xiàn)了網(wǎng)站的基本布局和樣式,并將動(dòng)態(tài)數(shù)據(jù)(如留言列表、錯(cuò)誤提示等)插入到指定位置。

4. 總結(jié)

本文介紹了一個(gè)簡(jiǎn)單明了的后端開發(fā)項(xiàng)目,幫助讀者掌握了從創(chuàng)建Flask應(yīng)用程序、實(shí)現(xiàn)用戶認(rèn)證和留言管理功能到完善前端界面的全流程。通過實(shí)踐,讀者不僅掌握了Python Flask框架的基本知識(shí)和使用方法,還學(xué)會(huì)了如何使用Sqlite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)、使用session管理用戶登錄狀態(tài)、使用Flask模板引擎渲染動(dòng)態(tài)頁(yè)面等技術(shù)。

當(dāng)然,這只是一個(gè)簡(jiǎn)單的項(xiàng)目示例,實(shí)際開發(fā)中可能需要更多的功能和復(fù)雜的業(yè)務(wù)邏輯。但掌握了本文介紹的基礎(chǔ)知識(shí)和技能,讀者就可以進(jìn)一步學(xué)習(xí)和探索,開發(fā)出更加強(qiáng)大、穩(wěn)定和可擴(kuò)展的Web應(yīng)用程序。


0 人點(diǎn)贊