Flask初步学习

本文详细介绍Flask Web框架的基本使用方法,包括环境搭建、数据库连接、路由设置、视图函数编写及用户登录验证等功能。通过一个完整的示例项目,展示如何用Flask创建并运行一个具备基本CRUD操作的博客应用。

Flask文档  http://docs.jinkan.org/docs/flask/index.html

快速入门:http://docs.jinkan.org/docs/flask/tutorial/introduction.html

文件目录

schema.sql 

drop table if exists entries;
create table entries (
  id integer primary key autoincrement,
  title string not null,
  text string not null
);

flaskr.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
-------------------------------------------------
   File Name:     flaskr
   Author :       zhang
   date:          2020/2/12
-------------------------------------------------
"""
# all the imports
import os
import sqlite3

from flask import Flask, request, session, g, redirect, url_for, abort, \
    render_template, flash

DATABASE = './flaskr.db'
DEBUG = True
SECRET_KEY = 'flask flask flask'
USERNAME = 'admin'
PASSWORD = 'password'

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

def connect_db():
    """Connects to the specific database."""
    rv = sqlite3.connect(app.config['DATABASE'])
    rv.row_factory = sqlite3.Row
    return rv

def init_db():
    from contextlib import closing
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql', mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()

#全局变量g.db没有定义,在系统启动前增加全局变量即可
@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    g.db.close()

@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()

layout.html

<!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>

show_entries.html

{% 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 %}

login.html

{% 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 %}

style.css

body            { font-family: sans-serif; background: #eee; }
a, h1, h2       { color: #377BA8; }
h1, h2          { font-family: 'Georgia', serif; margin: 0; }
h1              { border-bottom: 2px solid #eee; }
h2              { font-size: 1.2em; }

.page           { margin: 2em auto; width: 35em; border: 5px solid #ccc;
                  padding: 0.8em; background: white; }
.entries        { list-style: none; margin: 0; padding: 0; }
.entries li     { margin: 0.8em 1.2em; }
.entries li h2  { margin-left: -1em; }
.add-entry      { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl   { font-weight: bold; }
.metanav        { text-align: right; font-size: 0.8em; padding: 0.3em;
                  margin-bottom: 1em; background: #fafafa; }
.flash          { background: #CEE5F5; padding: 0.5em;
                  border: 1px solid #AACBE2; }
.error          { background: #F0D6D6; padding: 0.5em; }

### 使用Flask构建学习资源推荐系统 #### 构建基础环境 为了建立一个学习资源推荐系统,首先需要设置好开发环境。确保已经安装了`Flask`以及`Flask-RESTful`这两个必要的组件[^1]。 ```bash pip install flask flask-restful ``` #### 初始化项目结构 创建一个新的Python脚本作为入口文件,并导入所需的模块: ```python from flask import Flask, request, jsonify from flask_restful import Api, Resource import pandas as pd from sklearn.metrics.pairwise import cosine_similarity from scipy.sparse import csr_matrix app = Flask(__name__) api = Api(app) ``` 这段代码初始化了一个基本的Flask应用并集成了Flask-RESTful以便于后续定义API接口[^2]。 #### 数据准备与预处理 对于学习资源推荐系统来说,通常会有一个包含用户行为记录的数据集(比如点击次数、评分等)。这里假设已经有了这样的CSV文件存储着历史数据。加载这些数据并对它们做一些初步清理工作是非常重要的一步。 ```python data_path = 'path_to_your_data.csv' df = pd.read_csv(data_path) # 假设数据集中至少包含了'user_id', 'resource_id' 和 'rating' 这三个字段 matrix = df.pivot_table(index='user_id', columns='resource_id', values='rating').fillna(0) mat_user_resource = csr_matrix(matrix.values) cosine_similarities = cosine_similarity(mat_user_resource) ``` 此部分利用Pandas读取外部数据源,并借助SciPy计算不同用户之间相似度矩阵,这是实现个性化推荐的关键所在[^3]。 #### 创建推荐逻辑 接下来就是核心环节——编写实际执行推荐算法的部分。下面展示的是基于协同过滤的方法之一:找到最接近当前用户的几个邻居,然后根据他们喜欢的内容来进行预测。 ```python class Recommendation(Resource): def get(self, user_id): try: idx = matrix.index.get_loc(user_id) sim_scores = list(enumerate(cosine_similarities[idx])) sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)[1:] top_n_neighbors = 5 # 可调整参数 neighbor_indices = [i[0] for i in sim_scores[:top_n_neighbors]] recommended_resources = [] for index in neighbor_indices: resources_rated_by_neighbor = set(df[df['user_id'] == matrix.index[index]]['resource_id']) new_recommendations = resources_rated_by_neighbor.difference(set(recommended_resources)) if not new_recommendations: continue best_item = max(new_recommendations, key=lambda item: df[(df['resource_id']==item)&\ (df['user_id'].isin([matrix.index[i] \ for i in neighbor_indices]))]['rating'].mean()) recommended_resources.append(best_item) return {'recommended': list(recommended_resources)}, 200 except Exception as e: return {"error": str(e)}, 400 api.add_resource(Recommendation, '/recommend/<int:user_id>') ``` 上述代码片段展示了如何接收来自客户端请求中的特定用户ID,并返回一系列可能感兴趣的学习材料列表给该用户。注意这里的错误处理机制也非常重要,它可以提高系统的健壮性和用户体验[^4]。 #### 启动服务端口监听 最后,在主程序中加入如下语句即可让服务器处于运行状态等待HTTP请求的到来。 ```python if __name__ == '__main__': app.run(debug=True) ``` 这样就完成了一个简易版的学习资源推荐系统的搭建过程。当然,真实场景下的解决方案可能会更加复杂和完善,涉及到更多高级特性的运用和技术选型上的考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值