澳门至尊网站-首页

您的位置:澳门至尊网站 > 技术教程 > flask学习指南

flask学习指南

2019-11-28 08:04

明天意识了智力残疾的真小编。

Flask框架的学习指南之塑造简单blog系统,flask学习指南

从前写了后生可畏篇flask开辟意况搭建,后天再而三,举行三个实战小品种-blog系统。

blog系统非常轻松,唯有贰个页面,然后五脏俱全麻雀虽小。这里指标不是为了做项目而做项目,那篇作品本意是透过此次操演传达以下多少个知识点:

1、从全局上通晓flask项指标目录布局

2、flask项目标运营机制

3、flask框架完毕MVC构造

4、flask-sqlalchemy 操作mysql数据库

生机勃勃、新建项目:blog系统

在pycharm中,新建flask项目,如下图:

图片 1

成功后的目录构造是那样的:相当的轻松,叁个static文件夹,三个templates文件夹,三个py文件

图片 2

如上的目录构造是flask最初时的组织,那些只可以答复极小的类型,对于大型复杂的门类,我们要求引进包的管住,MVC布局划虚构计。

二、目录布局重构,引进包管理

针对地点的布局,在最上层blog3目录下,

   1、新建三个runserver.py文件,作为项目统后生可畏入口文件

   2、新建blog文件夹,把已存在的static,templates,blog3.py移到blog文件夹下,然后分别建controller、model文件夹。把blog3.py化名称叫__init__.py,

后天目录如下所示:

图片 3

这么就一定于三个大工程布局了:

1卡塔 尔(阿拉伯语:قطر‎最上层blog2目录是项目名称,一个品类下能够总结三个模块,约等于利用,种种应用下有自身的布署文件,开头化文件,MVC结构。

2卡塔 尔(英语:State of Qatar)runserver.py:与利用模块平级,作为项目运行文件

3卡塔尔第二级blog2索引:模块名称

       controller目录:MVC中的C,主要存放视图函数

       model目录:MVC中的M,首要寄存在实体类文件,映射数据库中表

       templates:MVC中的V,存放html文件

       static:静态文件,主要存放在css,js等公事

       __init__.py:模块伊始化文件,Flask 程序对象的始建必得在 __init__.py 文件里做到, 然后大家就足以安全的导入引用每种包。

       setting.py:配置文件,数据库客户名密码等等

三、开采代码

1、先把品种运维起来:

1) 编写__init__.py文件,创造项目对象,代码如下:

# -*- coding: utf-8 -*-
from flask import Flask

#创建项目对象
app = Flask(__name__)

2卡塔尔国 在runserver.py文件中加多如下代码:

from blog3 import app

@app.route('/')
def hello_world():
  return 'Hello World!'
if __name__ == '__main__':
  app.run(debug=True)

3)运行runserver.py文件:

图片 4

然后在浏览器中输入:

图片 5

到此地,项目雏形就足以健康运维了,上边包车型地铁事情就回顾了,加多内容,让项目维妙维肖吧。

2、设计数据库

本次练习比较轻巧,就四个表,三个user表,八个稿子表。我们选择python的orm框架flask-sqlalchemy完毕表的创制、增删改查成效。

在model文件夹中加多User.py和Category.py文件,内容如下:

1) User.py:

from blog2 import db

class User(db.Model):
  __tablename__ = 'b_user'
  id = db.Column(db.Integer,primary_key=True)
  username = db.Column(db.String(10),unique=True)
  password = db.Column(db.String(16))

  def __init__(self,username,password):
    self.username = username
    self.password = password
  def __repr__(self):
    return '<User %r>' % self.username

2) Category.py

from blog2 import db

class Category(db.Model):
  __tablename__ = 'b_category'
  id = db.Column(db.Integer,primary_key=True)
  title = db.Column(db.String(20),unique=True)
  content = db.Column(db.String(100))

  def __init__(self,title,content):
    self.title = title
    self.content = content
  def __repr__(self):
    return '<Category %r>' % self.title

3卡塔尔在模块目录blog2下新建setting.py文件,配置数据库连接新闻

# _*_ coding: utf-8 _*_

#调试模式是否开启
DEBUG = True

SQLALCHEMY_TRACK_MODIFICATIONS = False
#session必须要设置key
SECRET_KEY='A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

#mysql数据库连接信息,这里改为自己的账号
SQLALCHEMY_DATABASE_URI = "mysql://username:[email protected]:port/dbname"

4卡塔 尔(阿拉伯语:قطر‎让项目读取配置文件

修改__init__.py:加多如下内容(水晶色部分卡塔 尔(英语:State of Qatar):

# -*- coding: utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)#import os#print os.environ.keys()#print os.environ.get('FLASKR_SETTINGS')#加载配置文件内容app.config.from_object('blog2.setting')   #模块下的setting文件名,不用加py后缀 app.config.from_envvar('FLASKR_SETTINGS')  #环境变量,指向配置文件setting的路径#创建数据库对象 db = SQLAlchemy(app)

注意:FLASKR_SETTINGS情状变量需求手工业单独设置,window下能够在命令行中输入:

E:workdirblog2> set FLASKR_SETTINGS=E:workdirblog2blog2setting.py

依旧点击本人的Computer-->高端-->碰着变量,新建二个。

5卡塔尔创造数据库和表

windows命令行形式下,cd到项目runserver.py那么些目录下,步入python shell下:

输入豉豆红部分:

E:workdirblog2>python
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
Type "help", "copyright", "credits" or "license" for more information.
>>> from blog2 import db
>>> db.create_all()
>>>
>>>

举个例子未有别的错误输出代表创造数据库和表成功了。此时大家到数据库中去查看:

图片 6

数据库已经存在了,再看看表情形:开掘并未对景挂画的b_user和b_category表。那是怎么吗?是还是不是绝非找到model目录下的三个类呢。问题在于:__init__.py文件未有引入model包,导致__init__.py不能找到实体类。记住:一切模块对象的创办都在__init__.py中完成

在blog2目录下的__init__.py增加如下代码:

#只有在app对象之后声明,用于导入model否则无法创建表
from blog2.model import User,Category

双重运维方面命令:db.create_all()方法。那时表已经创制作而成功了。

图片 7

3、增多分界面模板:如登入页面,展现blog文章页面,增加blog页面

在templates目录下增添四个html文件:

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>

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

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.content|safe }}
 {% else %}
  <li><em>Unbelievable. No entries here so far</em>
 {% endfor %}
 </ul>
{% endblock %}

对应static中添加css文件: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; }

4、增添业务逻辑

在controller目录下新建blog_message.py文件:

from blog2.model.User import User
from blog2.model.Category import Category
import os

from blog2 import app,db
from flask import request,render_template,flash,abort,url_for,redirect,session,Flask,g

@app.route('/')
def show_entries():
categorys = Category.query.all()
return render_template('show_entries.html',entries=categorys)

@app.route('/add',methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
title = request.form['title']
content = request.form['text']
category = Category(title,content)
db.session.add(category)
db.session.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':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=request.form['username']).first()
passwd = User.query.filter_by(password=request.form['password']).first()

if user is None:
error = 'Invalid username'
elif passwd is None:
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'))

纯属不要忘记了在模块级目录下(blog2索引)的__init__.py文件引进视图模块,代码如下:

#只有在app对象之后声明,用于导入view模块
from blog2.controller import blog_manage

5、运维项目,效果如下:

1)输入

图片 8

2)点击log in

图片 9

忘了报告您了,你要优先在b_user表中增添一个顾客喔,因为登入要表明客户的,否则你是不可能登录成功的。

3卡塔 尔(英语:State of Qatar) 增加条目款项

图片 10 

以上正是其一小品种的保有页面,很简短吗。你一定能化解!!!

【总结】:通过此次演习,是还是不是对flask框架运转搭乘飞机制有所理解呢,是还是不是早就有了全局的认知了,如若ok,那么那一个小演习就有存在价值了。

参照他事他说加以考察文献:

         【flask连忙入门汉语版】

         【flask急迅入门希伯来语版】

         【flask-sqlalchemy中文版】

         【flask-sqlalchemy英文版】

以前写了大器晚成篇flask开拓遇到搭建,明天延续,进行叁个实战小品种-blog系统。 blog系统...

刚入门flask,建了叁个文书命名为flask.py

在virtualenv的器皿里运维该py文件,报错cannot import name 'Flask' from 'flask'。

那是因为它导入的模块不是本人用pip安装那些,而是自身那几个自定义模块flask.py,首先去当前目录下找flask.py去了。

改个名字就ok了,myflask.py。

万风流倜傥几时还应该有这些错误,十之八九有同有名的模特块,找错了。

 

本文由澳门至尊网站发布于技术教程,转载请注明出处:flask学习指南

关键词: