帮我写一个基于 Flask 的在线投票应用,支持用户创建投票、参与投票和查看投票结果
时间: 2024-03-05 14:54:00 浏览: 22
好的,以下是一个基于Flask的在线投票应用,支持用户创建投票、参与投票和查看投票结果。代码中使用了SQLite作为数据存储方式,你可以根据实际需要修改为其他数据库。
```python
from flask import Flask, render_template, request, redirect, url_for
import sqlite3
app = Flask(__name__)
# 设置数据库文件路径
DATABASE = 'polls.db'
# 创建数据库表
def init_db():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS polls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
question TEXT NOT NULL,
options TEXT NOT NULL,
votes TEXT NOT NULL
)
''')
conn.commit()
conn.close()
# 初始化数据库
init_db()
# 首页,显示所有投票
@app.route('/')
def index():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 查询所有投票
c.execute('SELECT id, question FROM polls')
polls = c.fetchall()
conn.close()
return render_template('index.html', polls=polls)
# 投票详情页,显示投票问题和选项
@app.route('/poll/<int:poll_id>')
def poll(poll_id):
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 查询投票信息
c.execute('SELECT question, options, votes FROM polls WHERE id = ?', (poll_id,))
question, options_str, votes_str = c.fetchone()
conn.close()
# 解析选项和投票结果
options = options_str.split(',')
votes = votes_str.split(',')
# 统计每个选项的票数
results = {}
for option, vote in zip(options, votes):
results[option] = vote.count('1')
return render_template('poll.html', poll_id=poll_id, question=question, options=options, results=results)
# 投票处理,更新投票结果
@app.route('/vote', methods=['POST'])
def vote():
poll_id = request.form['poll_id']
option = request.form['option']
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 查询投票信息
c.execute('SELECT options, votes FROM polls WHERE id = ?', (poll_id,))
options_str, votes_str = c.fetchone()
# 更新投票结果
options = options_str.split(',')
votes = votes_str.split(',')
index = options.index(option)
votes[index] += '1'
votes_str = ','.join(votes)
c.execute('UPDATE polls SET votes = ? WHERE id = ?', (votes_str, poll_id))
conn.commit()
conn.close()
return redirect(url_for('poll', poll_id=poll_id))
# 创建投票页面
@app.route('/create')
def create():
return render_template('create.html')
# 创建投票处理,将投票信息插入数据库
@app.route('/submit', methods=['POST'])
def submit():
question = request.form['question']
options_str = request.form['options']
options = options_str.split(',')
votes = ['0'] * len(options)
votes_str = ','.join(votes)
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 插入投票信息
c.execute('INSERT INTO polls (question, options, votes) VALUES (?, ?, ?)', (question, options_str, votes_str))
poll_id = c.lastrowid
conn.commit()
conn.close()
return redirect(url_for('poll', poll_id=poll_id))
if __name__ == '__main__':
app.run(debug=True)
```
该应用中包含以下几个页面:
- 首页:显示所有投票;
- 投票详情页:显示投票问题、选项和结果;
- 创建投票页面:创建新的投票。
你可以根据实际需要修改模板文件(templates目录下的HTML文件)和静态文件(static目录下的CSS和JS文件)。