【python】flask入门

本文介绍如何利用Flask框架结合SQLAlchemy ORM工具搭建一个简单的新闻管理系统,包括数据库模型定义、基本CRUD操作及分页显示等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

>pip install Flask

>pip install Flask-SQLAlchemy


一个小框架:flask_news.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost:3306/net_news?charset=utf8' 
db = SQLAlchemy(app)

class News(db.Model):
    ''' 新闻类型 '''
    __tablename__ = 'news'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False) 
    content = db.Column(db.String(2000), nullable=False)
    types = db.Column(db.String(10), nullable=False)
    image = db.Column(db.String(300))
    author = db.Column(db.String(20))
    view_count = db.Column(db.Integer)
    created_at = db.Column(db.DateTime)
    is_valid = db.Column(db.Boolean)

#News.metadata.create_all()
    def __repr__(self):
        return '<News %r>' % self.title #>>>News.query.all()查询,以此种方式展示<News 'title'>,不然显示的就是各种编码地址

@app.route('/hello')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
>>> from flask_news import db 
>>> db.create_all()
>>> from flask_news import News
>>>
>>> new_obj = News(
...             #中文需要编码,加utf8
...             title='ORM标题',
...             content='内容',
...             types="百家"
...         )
>>> db.session.add(new_obj)
>>> db.session.commit()
>>> News.query.all()
[<News 'ORM标题'>, <News 'ORM标题'>]


/admin界面显示数据库的数据信息,加分页,flask_news.py:

from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost:3306/net_news?charset=utf8'
db = SQLAlchemy(app)

class News(db.Model):
    ''' 新闻类型 '''
    __tablename__ = 'news'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False) 
    content = db.Column(db.String(2000), nullable=False)
    types = db.Column(db.String(10), nullable=False)
    image = db.Column(db.String(300))
    author = db.Column(db.String(20))
    view_count = db.Column(db.Integer)
    created_at = db.Column(db.DateTime)
    is_valid = db.Column(db.Boolean)

#News.metadata.create_all()
    def __repr__(self):
        return '<News %r>' % self.title

@app.route('/')
def index():
    '''新闻的首页'''
    news_list = News.query.all()
    # news_list = News.query.filter_by(is_valid = 1)  
    return render_template('index.html',news_list = news_list)

@app.route('/cat/<name>/')
def cat(name):
    '''新闻的类别'''
    news_list = News.query.filter(News.types == name)
    #查询类别为name的新闻数据
    return render_template('cat.html',name = name,news_list = news_list)

@app.route('/detail/<int:pk>/')
def detail(pk):
    '''新闻详情信息'''
    new_obj = News.query.get(pk)
    return render_template('detail.html',new_obj = new_obj)

@app.route('/admin/')
@app.route('/admin/<int:page>/')
def admin(page = None):
    '''新闻管理首页'''
    #如果没有传,则表示第一页
    if page is None:
        page = 1
    # news_list = News.query.all()
    news_list = News.query.paginate(page=page,per_page=5) #分页
    return render_template('admin/index.html',news_list = news_list)

@app.route('/admin/add/')
def add():
    return render_template('admin/add.html')

@app.route('/admin/update/<int:pk>/')
def update(pk):
    '''新闻详情信息'''
    new_obj = News.query.get(pk)
    return render_template('update.html',new_obj = new_obj)

@app.route('/admin/delete/<int:pk>/')
def delete(pk):
    '''新闻详情信息'''
    new_obj = News.query.get(pk)
    return render_template('delete.html',new_obj = new_obj)

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

/admin/index.html

{% extends 'admin/base.html' %}
{% block title %}
<title>新闻管理首页</title>
{% endblock %}
{% block content %}
<table class="table table-striped">
  <thead>
    <tr>
      <th>编号</th>
      <th>新闻标题</th>
      <th>类别</th>
      <th>添加时间</th>
      <th>操作</th>
    </tr>
  </thead>
  <tbody>
  {% for new_obj in news_list.items %}
    <tr>
      <td>{{ new_obj.id }}</td>
      <td>{{ new_obj.title }}</td>
      <td>{{ new_obj.types }}</td>
      <td>{{ new_obj.created_at }}</td>
      <td><a class="btn btn-info" href="{{ url_for('update', pk=new_obj.id) }}">修改</a>
      <a class="btn btn-danger" href="javscript:;" data-url="{{ url_for('delete', pk=new_obj.id) }}">删除</a></td>
    </tr>
    {% endfor %}
  </tbody>
</table>
<nav aria-label="Page navigation">
  <ul class="pagination">
    <li>
      {% if news_list.has_prev %}
      <a href="#" aria-label="Previous">
        <span aria-hidden="true">«</span>
      </a>
      {% else %}
      {% endif %}
    </li>
    {% for page in news_list.iter_pages() %}
    <li><a href="{{ url_for('admin', page=page) }}">{{ page }}</a></li> <!-- href实现点击1,2,页面跳转 -->
    {% endfor %}
    <li>
      <a href="#" aria-label="Next">
        <span aria-hidden="true">»</span>
      </a>
    </li>
  </ul>
</nav>
{% endblock %}
{% block extrajs %}
<script>
  $(function(){
    $('.btn-danger').on('click', function(){
      var btn = $(this);
      if(confirm('确定删除该记录吗?')){
        $.post(btn.attr('data-url'), function(data){
          if (data === 'yes'){
            btn.parents('tr').hide();
          }else{
            alert('删除失败');
          }
        })
      }
    })
  })
</script>
{% endblock  %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值