python + flask + sqlite3做一个小博客

1 篇文章 0 订阅
1 篇文章 0 订阅

背景:最近刚学习完python的基本语法,就迫不及待想去做一些小项目。由于我是做前端的,对服务器比较感兴趣,就寻思着做一个后台服务。正好有个flask框架可以学习一下。Flask官方文档 

(官方文档上还是有许多坑的,不过通读一遍还是能学习到很东西)

1、代码结构

/flaskr
    /templates
        lay_out.html
        login.html
        show_entries.html
    /static
    flaskr.py
    schema.sql

/templates文件夹,放置模版、/static放静态资源(css,js)、schema.aql 为sqllite数据库模式配置文件

2、先贴代码  算了,先配置虚拟环境吧(windows 操作系统下)

  •       安装 virtualenv
    pip install virtualenv
  •       创建 venv 虚拟环境
    $ cd flaskr
    $ virtualenv venv
    New python executable in venv/bin/python
    Installing distribute............done.

                                                                                                                                                                                                

  •     激活虚拟环境(激活必须是cmd 超级管理员模式下激活)

     venv\scripts\activate

激活后的效果(路径前面有"venv")

这时 运行python(导入flask,不报错即为成功)

>> from flask import Flask

3、贴代码了:

# flaskr.py
# all the imports
from __future__ import with_statement
from contextlib import closing  # contextlib.closing()会帮它加上__enter__()和__exit__(),使其满足with的条件。
import sqlite3
import time
from flask import Flask, request, session, g, redirect, url_for, \
    abort, render_template, flash

# configuration
DATABASE = './flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = '1'
PASSWORD = '1'

app = Flask(__name__)
app.config.from_object(__name__)

app.config.from_envvar('FLASKR_SETTINGS', silent=True)


def connect_db():
    return sqlite3.connect(app.config['DATABASE'])


def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()


@app.before_request
def before_request():
    g.db = connect_db()


@app.after_request
def after_request(response):
    g.db.close()
    return response


@app.route('/')
def show_entries():
    cur = g.db.execute('select title, text from entries order by id desc')
    entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
    return render_template('show_entries.html', entries=entries)


@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('insert into entries (title, text) values (?, ?)',
                 [request.form['title'], request.form['text']])
    g.db.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('show_entries'))


@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('You were logged in')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)


@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))


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

schema.sql

drop table if exists entries;
create table entries(
    id integer primary key autoincrement,
    title string not null ,
    text string nit null
);
<!--layout-->
<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
  <h1>Flaskr</h1>
  <div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
  {% endif %}
  </div>
  {% for message in get_flashed_messages() %}
    <div class=flash>{{ message }}</div>
  {% endfor %}
  {% block body %}{% endblock %}
</div>
<!--login-->
{% extends "layout.html" %}
{% block body %}
  <h2>Login</h2>
  {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
  <form action="{{ url_for('login') }}" method=post>
    <dl>
      <dt>Username:
      <dd><input type=text name=username>
      <dt>Password:
      <dd><input type=password name=password>
      <dd><input type=submit value=Login>
    </dl>
  </form>
{% endblock %}
<!--show_entries-->
{% extends "layout.html" %}
{% block body %}
  {% if session.logged_in %}
    <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
      <dl>
        <dt>Title:
        <dd><input type=text size=30 name=title>
        <dt>Text:
        <dd><textarea name=text rows=5 cols=40></textarea>
        <dd><input type=submit value=Share>
      </dl>
    </form>
  {% endif %}
  <ul class=entries>
  {% for entry in entries %}
    <li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
  {% else %}
    <li><em>Unbelievable.  No entries here so far</em>
  {% endfor %}
  </ul>
{% endblock %}

试着运行吧? 肯定是不行滴,数据库弄了吗?

4、数据库sqllite

  • 安装

         请在官网下载

 

解压后,在环境变量中添加path

  • 创建数据库

flaskr文件夹中 打开cmd

$ sqlite3 flaskr.db

用命令.database 查询系统中的数据库,确认数据库已经成功创建

 

sqlite> .database

ok 大功搞成,启动程序试一下吧

 

好的,下面是一个简单的信息管理系统的代码实现,使用的是PythonFlask框架和SQLite3数据库。这个信息管理系统可以添加、删除、修改和查询用户信息,包括姓名、年龄和性别。 1. 创建数据库和表格 首先需要创建一个SQLite3数据库,并创建一个名为“users”的表格,用来存储用户信息。表格包括id、name、age和gender四个字段。 ```sql CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL, gender TEXT NOT NULL ); ``` 2. 安装依赖库 需要安装FlaskSQLite3库,可以使用pip命令进行安装。 ```python pip install flask pip install sqlite3 ``` 3. 编写Flask应用程序 ```python from flask import Flask, render_template, request, redirect, url_for, flash import sqlite3 app = Flask(__name__) app.secret_key = 'secret_key' # 连接数据库 def get_db(): conn = sqlite3.connect('users.db') conn.row_factory = sqlite3.Row return conn # 关闭数据库 def close_db(e=None): db = get_db() 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() # 插入数据 def insert_data(name, age, gender): db = get_db() db.execute('INSERT INTO users (name, age, gender) VALUES (?, ?, ?)', (name, age, gender)) db.commit() # 查询数据 def select_data(): db = get_db() users = db.execute('SELECT * FROM users').fetchall() return users # 更新数据 def update_data(id, name, age, gender): db = get_db() db.execute('UPDATE users SET name = ?, age = ?, gender = ? WHERE id = ?', (name, age, gender, id)) db.commit() # 删除数据 def delete_data(id): db = get_db() db.execute('DELETE FROM users WHERE id = ?', (id,)) db.commit() # 显示用户信息列表 @app.route('/') def show_users(): users = select_data() return render_template('show_users.html', users=users) # 添加用户信息 @app.route('/add_user', methods=['GET', 'POST']) def add_user(): if request.method == 'POST': name = request.form['name'] age = request.form['age'] gender = request.form['gender'] if not name: flash('姓名不能为空!') elif not age: flash('年龄不能为空!') elif not gender: flash('性别不能为空!') else: insert_data(name, age, gender) return redirect(url_for('show_users')) return render_template('add_user.html') # 编辑用户信息 @app.route('/edit_user/<int:id>', methods=['GET', 'POST']) def edit_user(id): user = get_db().execute('SELECT * FROM users WHERE id = ?', (id,)).fetchone() if request.method == 'POST': name = request.form['name'] age = request.form['age'] gender = request.form['gender'] if not name: flash('姓名不能为空!') elif not age: flash('年龄不能为空!') elif not gender: flash('性别不能为空!') else: update_data(id, name, age, gender) return redirect(url_for('show_users')) return render_template('edit_user.html', user=user) # 删除用户信息 @app.route('/delete_user/<int:id>') def delete_user(id): delete_data(id) return redirect(url_for('show_users')) if __name__ == '__main__': app.run(debug=True) ``` 4. 创建HTML模板 创建三个HTML模板,分别用于显示用户信息列表、添加用户信息和编辑用户信息。这里只显示部分代码。 show_users.html ```html <table> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>操作</th> </tr> </thead> <tbody> {% for user in users %} <tr> <td>{{ user['id'] }}</td> <td>{{ user['name'] }}</td> <td>{{ user['age'] }}</td> <td>{{ user['gender'] }}</td> <td> <a href="{{ url_for('edit_user', id=user['id']) }}">编辑</a> <a href="{{ url_for('delete_user', id=user['id']) }}" onclick="return confirm('确认删除?')">删除</a> </td> </tr> {% endfor %} </tbody> </table> ``` add_user.html ```html <form method="post"> <div> <label for="name">姓名:</label> <input type="text" id="name" name="name"> </div> <div> <label for="age">年龄:</label> <input type="text" id="age" name="age"> </div> <div> <label for="gender">性别:</label> <input type="text" id="gender" name="gender"> </div> <div> <input type="submit" value="添加"> </div> </form> ``` edit_user.html ```html <form method="post"> <div> <label for="name">姓名:</label> <input type="text" id="name" name="name" value="{{ user['name'] }}"> </div> <div> <label for="age">年龄:</label> <input type="text" id="age" name="age" value="{{ user['age'] }}"> </div> <div> <label for="gender">性别:</label> <input type="text" id="gender" name="gender" value="{{ user['gender'] }}"> </div> <div> <input type="submit" value="保存"> </div> </form> ``` 5. 运行应用程序 在终端中运行以下命令启动应用程序: ```python python app.py ``` 然后在浏览器中访问http://localhost:5000/即可看到信息管理系统的界面。可以添加、删除、修改和查询用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值