基于flask的microBlog开发笔记(一)

项目地址: https://coding.net/u/bwael/p/micblog/git

1. 开发环境

  • 在linux系统开发
  • 开发语言python,使用框架flask
  • 使用Mysql数据库,初期使用sqlite方便开发

2. 环境配置

###1. flask的安装

  • 创建一个全新的实验环境,则安装python虚拟软件管理包virtualenv来创建python的
    独立环境,先更新软件包,在安装pip和虚拟环境virtualenv:

    $ sudo pacman -Syy

    $ sudo pacman -S python-pip python-virtualenv

  • 创建虚拟环境,先创建一个虚拟环境flask,在激活环境,

    $ virtualenv flask

    $ cd flask

    $ source bin/activate

1
2
3
	$ pip install flask flask-login flask-openid flask-mail splalchemy 
flask-sqlalchemy sqlalchemy-migrate flask-whooshalchemy flask-wtf pytz
flask-babel flup

###2. 体验flask

  • 在home/bwael目录下
1
2
3
$ mkdir -p micblog/app
$ mkdir -p micblog/app/static
$ mkdir -p micblog/app/templates

tips:我们的应用程序包是放置在app文件夹中,子文件夹
static用来放置静态文件,子文件夹templates是存放模板文
件类的html文件。

  • 接下来进入到app文件夹中,并创建init.py和views.py

    1
    2
    3
    $ cd micblog/app
    $ touch __init__.py
    $ touch views.py
  • 对app包通过命令vi_init_.py进行简单的初始化,在init.py中写

    1
    2
    3
    from flask import Flask
    app = Flask(__name__)
    from app import views

上面的代码简单的创建应用对象,接着从app中导入视图模块views文件内容,视图是响应来自网页浏览器的请求的处理器,在flask中视图以python函数形式表示。

  • 编写视图函数(app/views.py)
    1
    2
    3
    4
    5
    from app import app
    @app.route('/')
    @app.route('/index')
    def index():
    return "Hello!!"

完整的web应用程序最后一步建一个脚本rnu.py,用于启动应用程序的开发web服务器,将其置于micblog目录下。

  • micblog/run.py
1
2
3
	from app import app
app.run(debug = True,port=8888)
`

启动运行后在客户端的浏览器中输入http://127.0.0.1:8888,在网页中会显示hello!字符串。

###3. flask模板

  • 模板中的控制语句,在模板中添加一个if声明(app/templates/index.html)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <html>
    <head>
    {% if title %}
    <title>{{ title }} - microblog</title>
    {% else %}
    <title>Welcome to microblog</title>
    {% endif %}
    </head>
    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>
    </html>
  • 模板中的循环语句,在microblog应用程序中,登陆的用户在首页想要展示自己或者联系人列表中用户最近的文章,我们首先创建一些用户以及他们的文章来展示(app/views.py)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def index():
    user = { 'nickname': 'Miguel' } # 用户名
    posts = [ # 提交内容
    {
    'author': { 'nickname': 'John' },
    'body': 'Beautiful day in Portland!'
    },
    {
    'author': { 'nickname': 'Susan' },
    'body': 'The Avengers movie was so cool!'
    }
    ]
    return render_template("index.html",
    title = 'Home',
    user = user,
    posts = posts)

    在模板中,列表中可能有许多元素,有多少篇文章被展示取决于视图函数,模板不会假设有多少文章,所以必须准备渲染视图传送的文章数量,使用for来做到这一点(app/templates/index.html)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <html>
    <head>
    {% if title %}
    <title>{{ title }} - microblog</title>
    {% else %}
    <title>microblog</title>
    {% endif %}
    </head>
    <body>
    <h1>Hi, {{ user.nickname }}!</h1>
    {% for post in posts %}
    <p>{{ post.author.nickname }} says: <b>{{ post.body }}</b></p>
    {% endfor %}
    </body>
    </html>
  • 在模板继承中,允许我们把所有模板公共的部分移除出页面的布局,接着把它们放在一个基础模板中,所有使用它的模板可以导入该基础模板。定义一个基础模板,该模板包含导航栏以及标题(app/templates/base.html)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <html>
    <head>
    {% if title %}
    <title>{{ title }} - microblog</title>
    {% else %}
    <title>microblog</title>
    {% endif %}
    </head>
    <body>
    <div>Microblog: <a href="/index">Home</a></div>
    <hr>
    {% block content %}{% endblock %}
    </body>
    </html>

    在这个模板中使用block控制语句来定义派生模板可以插入的地方,块被赋予唯一的名字。接着就是修改index.html模板继承自base.html(app/templates/index.html)

    1
    2
    3
    4
    5
    6
    7
    {% extends "base.html" %}
    {% block content %}
    <h1>Hi, {{ user.nickname }}!</h1>
    {% for post in posts %}
    <div><p>{{ post.author.nickname }} says: <b>{{ post.body }}</b></p></div>
    {% endfor %}
    {% endblock %}