基于Python Flask的个人博客搭建



  • 概述

    • Flask是一个使用Python编写的轻量级Web框架,其模板依赖于jinja2WSGI采用WerkZeug工具包(WSGI是规定web服务器与web应用如何交互、如何处理数据的规范,在介绍服务器部署时会详细介绍)。
    • 轻量级:之所以说Flask轻量,是因为与Django等框架相比,它使用简单的核心,通过扩展包增加其他功能,这使得Flask框架具有弹性。
    • Flask框架入门比较简单,适合开发小型网站,如果有高性能的架构设计和服务器部署,开发大型网站也无压力。
    • 参考资料:
      • 官网:http://flask.pocoo.org/
      • 《Flask Web开发:基于Python的Web应用开发实战》:入门篇,GitHub上有配套源码。
      • 《Flask Web开发实战:入门、进阶与原理解析》:这本书是上一本书的进阶,展示了几个网站开发示例,对Flask原理、服务器部署也有更深的探讨。

    之后会从基本框架、数据库、服务器来介绍如何使用Flask一步步搭建一个个人博客。



  • 顶,flask真的轻量!!!



  • Flask项目的结构
    为了快速上手,这里先介绍Flask项目典型的结构,之后会对每个模块进行说明。

    |-flasky
         |-app/
            |-templates/
            |-static/
            |-main/
               |-__init__.py
               |-errors.py
               |-forms.py
               |-views.py
            |-__init__.py
            |-email.py
            |-models.py
       |-migrations/
       |-tests/
            |-__init__.py
            |-test*.py
       |-venv/
       |-requirements.txt
       |-config.py
       |-manage.py
    

    文件夹

    • app下一般为Flask程序
    • migrations下为数据库迁移脚本
    • tests下为单元测试
    • venv 包含Python虚拟环境,创建虚拟环境的方法在Web方向下博客已有介绍,这里不再赘述

    文件

    • requirements.txt列出了所有依赖包,便于合作开发是使用相同的虚拟环境
    • config.py配置文件
    • manage.py启动整个程序


  • This post is deleted!


  • flask程序的基本结构之蓝本Blueprint

    这部分对照上面项目架构中的app/main下__init__.py文件,介绍Flask中的蓝本。

    _init_.py中,通过蓝本将所有模块组合,在蓝本中定义的路由只有由蓝本注册到程序上后,路由才真正成为程序的一部分。

    什么是蓝本?
    简单地说,蓝本允许将应用组织为模块,各模块通过蓝本可以灵活地组织在一起。蓝本可以在单个文件中定义,这里,程序包中创建了一个子包,用于保存蓝本,这使得程序更具灵活性。

    ```python
      示例:app/main/__init__.py:创建蓝本
      from flask import Blueprint
      main = Blueprint('main',__name__)
      from . import views, errors
    
      示例:app/__init__.py:注册蓝本
      # ...
      from .main import main as main_blueprint
      app.register_blueprint(main_blueprint)
      return app


  • flask程序的基本结构之初始化和路由

    初始化
    首先介绍Flask程序的初始化。Web服务器使用WSGI协议,把客户端的请求转交给这个对象处理。程序实例是Flask类对象,常通过如下方式创建:

    from flask import Flask                                                         
    app = Fask(__name__)
    

    下面对照项目架构中的app/main下view.py文件,主要介绍flask中的路由。

    什么是路由?
    客户端发送一个请求至服务器,服务器交给flask程序处理,程序需要直到每个URL对应哪些代码的运行,而处理URL和函数之间关系的程序成为路由。
    在Flask程序中定义路由的最简便方式,是使用app.route修饰器,把修饰的函数注册为路由,下main的例子展示了如何使用修饰器声明路由。

    @app.route('/')
    def index():                                                                      
        return '<h1>Hello World!</h1>'
    

    示例中index()成为试图函数,其返回值可以是包含HTML的简单字符串,也可以是复杂的表单,也可以是Json格式的数据。

    一个网站各页面的URL,常常包含相同前缀和可变部分,任何能匹配静态部分的URL都会映射到这个路由上。调用视图函数时,Flask会将动态部分作为参数传入函数,下面的示例定义的路由就包含可变部分。

    @app.route('/user/<name>')
    def user(name):                                                                   
        return '<h1>Hello %s!</h1>' % name


  • 在视图函数中操作数据库

    另一篇博客中已简要介绍了数据库在Web项目的应用,这次主要介绍如何在视图函数中处操作数据库。

    @app.route('/',methods=['GET','POST'])
    def index():
        form = NameForm()
        if form.validate_on_submit():
            user = User.query.filter_by(name=form.name.data).first()
            if user is None:
                user=User(name=form.name.data)
                db.session.add(user)
                seesion['known'] = False
            else
                session['known'] = True
            session['name']=form.name.data
            form.name.data=''
            return redirect(url_for('index'))
        return render_template('index.html',form=form,name=session['name'],known=seesion.get('known',false))
    

    提交表单后,程序使用filter_by()查询过滤器在数据库中查找提交的名字,如果用户不存在,则创建一个新用户,并添加到db.session中去,然后全局变量session将用户名缓存到本地。变量known被写入用户会话中,因此重定向之后,可以把数据传给模板。



  • 一直想自己搭建一个博客,这篇资料比较详细,我有时间自己尝试一下,非常感谢!



  • 这部分主要介绍如何搭建uWSGI+Ngnix环境来运行Python应用。

    uWSGI

    uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议、http协议等。uWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。
    uWSGI的主要特点是:

    • 超快的性能
    • 低内存占用
    • 多app管理
    • 详尽的日志功能(可以用来分析app的性能和瓶颈)
    • 高度可定制(内存大小限制,服务一定次数后重启等)
      uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配置文件中指定application的地址,uWSGI就能直接和应用框架中的WSGI application通信。

    Ngnix

    Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

    部署
    1.搭建虚拟环境

    • 安装virtualenv
    sudo apt-get update
    sudo apt-get install python-dev
    sudo pip install virtualenv
    
    • 如果代码已上传至github,可直接通过git clone http:项目地址,将代码拉取到本地。
    • 创建虚拟环境
    virtualenv myprojectenv
    
    • 激活虚拟环境
    source myprojectenv/bin/activate
    

    2.安装Flask及相关依赖

    pip install flask
    

    先安装相关依赖

    sudo apt-get install libcairo2-dev  libffi-dev libpango-1.0-0 
    sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
    

    将项目中的requirement.txt导出,安装requirement.txt中的相关依赖

    pip install -r requirements.txt
    

    3.配置uWSGI

    • 安装包
    sudo apt-get install uwsgi
    

    4.配置uwsgi

    • 创建配置文件
    nano ~/myproject/myproject.ini
    

    文件内容

    [uwsgi]
    module = wsgi:application
    master = true 
    processes = 5 
    socket = myproject.sock 
    
    chmod-socket = 660 
    vacuum = true 
    
    die-on-term = true
    
    • 创建自动启动文件,保证在服务器重启之后程序还可以正常运行
    sudo nano /etc/init/myproject.conf
    

    文件内容

    description "uWSGI server instance configured to serve myproject"
    
    start on runlevel [2345]
    stop on runlevel [!2345]
    
    setuid demo
    setgid www-data
    
    env PATH=/home/demo/myproject/myprojectenv/bin
    chdir /home/demo/myproject
    exec uwsgi --ini myproject.ini
    
    • 保存退出后,启动配置
    sudo start myproject
    

    5.配置Nginx

    • 安装包
    sudo apt-get install python-dev nginx
    
    • 配置Nginx
    sudo nano /etc/nginx/sites-available/myproject
    

    文件内容:

    server {
        listen 80;
        server_name 服务器地址或域名;
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/home/demo/myproject/myproject.sock;
        }
    }
    

    监听服务器的80端口,也就是我们浏览器一般会访问的端口。

    • 保存退出,链接文件,保证配置成功:
    
    sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
    
    • 删除默认的配置文件
    
    sudo rm /etc/nginx/sites-available/default
    
    • 测试一下Nginx配置是否正常
    
    sudo nginx -t
    

    没有错误之后重启nginx

    sudo service nginx restart



  • 顶,flask搭建个人博客的时候踩了好多坑,另外想了解一下在前后端分离开发模式下,传数据的各种问题


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.