基于Python Flask的个人博客搭建
-
概述
- Flask是一个使用Python编写的轻量级Web框架,其模板依赖于jinja2,WSGI采用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启动整个程序
-
此回复已被删除!
-
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搭建个人博客的时候踩了好多坑,另外想了解一下在前后端分离开发模式下,传数据的各种问题