本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深。最好对着源码,一步一步走。
下载源码,运行
pip install -r requirements.txt 建立环境
python db_create.py 创建自己数据库
python db_migrate 迁移数据库
————————————————————————————–
flask 不仅简介小巧,同时运用的时候十分灵活。下面简单介绍一下如何编写一个 flask项目。

涉及调用开发服务器,数据库连接以及 ORM 映射,还有数据库的迁移,模板使用。后期再完善会话,管理后台,缓存等。

一 、安装环境
我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移。

  1. $ pip install flask
  2. $ pip install SQLAlchemy==0.7.
  3. $ pip install flask-sqlalchemy
  4. $ pip install flask-migrate
    $ pip install sqlalchemy-migrate

二、建立项目
flask 没有 django 那样原生的 manage管理工具(flask-admin可以实现,日后再说)。因此我们需要手动建立目录。新建一个 myproject目录,在里面建 app tmp两个文件夹,然后在 app文件夹里面建立 static, templates 两个文件夹,用来存储静态文件和模板。最后目录结构如下:

  1. ├── app
  2. ├── static
  3. ├── templates
  4. └── tmp

三、 初始化文件

建立一些文件,在 app文件里建立 __init__.py models.py views.py 然后在与app 同目录下建立 config.py 和 run.py 此时的目录结构如下:

  1. (env)admin@admindeMacBook-Air:~/project/python/flask/project$ tree
  2.  
  3. ├── app
  4. ├── static
  5. ├── templates
  6. ├── __init__.py
  7. ├── models.py
  8. ├── views.py
  9. ├── config.py
  10. ├── run.py
  11. └── tmp

四 、开始项目

1 hello wrod
打开 (/app/__init.py) 文件,写入

  1. # -*- coding: utf-8 -*-
  2. from flask import Flask # 引入 flask
  3. app = Flask(__name__) # 实例化一个flask 对象
  4. import views # 导入 views 模块
  5. # from app import views

注意,我们的 app 文件夹其实是一个python包,from app import views 这句话也就是从 包app里面导入 views模块,所以写成注释的那句话也没错,其他代码实践喜欢写成后面那种

现在我们来开始写我们的视图,打开 (/app/views.py)

  1. # -*- coding: utf-8 -*-
  2. from app import app
  3. from models import User, Post, ROLE_USER, ROLE_ADMIN
  4. @app.route(‘/’)
  5. def index():
  6. return hello world, hello flask

下一步我们将要启动我们的开发服务器,打开 (/run.py)

  1. # -*- coding: utf-8 -*-
  2. from app import app
  3. if __name__ == __main__’:
  4. app.debug = True # 设置调试模式,生产模式的时候要关掉debug
  5. app.run() # 启动服务器

这段代码需要注意第一句 from app import app。也许会有疑问,我们的 app 包里,貌似没有 app.py 这样的模块。其实这是 flask 方式和python的导入方式。from app 指导入 app 包里的 __iniy__.py 所以这句话的含义是导入 __.init__.py 里面的 app实例。

打开shell 运行

  1. $ python run.py
  2. (env)admin@admindeMacBook-Air:~/project/python/flask/project$ python run.py
  3. * Running on http://127.0.0.1:5000/
  4. * Restarting with reloader

用浏览器打开 http://127.0.0.1:5000/ 将会看到一个输入 hello world 的页面

2 连接数据库
下面开始连接数据库引擎 先要做一个简单的配置 打开 (/config.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. import os
  4. basedir = os.path.abspath(os.path.dirname(__file__))
  5. SQLALCHEMY_DATABASE_URI = sqlite:///%s’ % os.path.join(basedir, ‘app.db’)
  6. SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, db_repository’)
  7. CSRF_ENABLED = True
  8. SECRET_KEY = you-will-never-guess

SQLALCHEMY_DATABASE_URI是the Flask-SQLAlchemy必需的扩展。这是我们的数据库文件的路径。

SQLALCHEMY_MIGRATE_REPO 是用来存储SQLAlchemy-migrate数据库文件的文件夹。

然后打开 (/app/__init__.py)

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from flask import Flask
  4. from flask.ext.sqlalchemy import SQLAlchemy
  5. from config import basedir
  6.  
  7. app = Flask(__name__)
  8. app.config.from_object(‘config’) # 载入配置文件
  9. db = SQLAlchemy(app) # 初始化 db 对象

# from app import views, models # 引用视图和模型

import views, models

  1.  

打开 (/app/models.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from app import db
  4. ROLE_USER = 0
  5. ROLE_ADMIN = 1

  6. class User(db.Model):
  7. id = db.Column(db.Integer, primary_key=True)
  8. nickname=db.Column(db.String(60), index=True, unique=True)
  9. email = db.Column(db.String(120), index=True, unique=True)
  10. role = db.Column(db.SmallInteger, default=ROLE_USER)

  11. def __repr__(self):
  12. return ‘<User %r>’ % self.nickname

我们的模型建立了一个 user类,正好是 数据库里面的 user 表,表有四个字段

现在我们的数据库配置已经好了,可是还没有建立数据库。新建一个文件 (/db_create.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from migrate.versioning import api
  4. from config import SQLALCHEMY_DATABASE_URI
  5. from config import SQLALCHEMY_MIGRATE_REPO
  6. from app import db
  7. import os.path
  8.  
  9. db.create_all()
  10.  
  11. if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
  12. api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
  13. api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
  14. else:
  15. api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))

这个脚本是完全通用的,所有的应用路径名都是从配置文件读取的。当你用在自己的项目时,你可以把脚本拷贝到你的项目目录下就能正常使用了。
打开shell 运行

$ python db_create.py

运行这条命令之后,你就创建了一个新的app.db文件。这是个支持迁移的空sqlite数据库,同时也会生成一个带有几个文件的db_repository目录,这是SQLAlchemy-migrate存储数据库文件的地方,注意如果数据库已存在它就不会再重新生成了。这将帮助我们在丢失了现有的数据库后,再次自动创建出来。
运行
slqite3 app.db

>>> .tables

>>> user

或者使用 sqlite 图形化客户端,没有需要安装 (windows 下直接下载安装包即可)

$ sudo apt-get install sqlitebrowser
3 数据库迁移
每当我们更改了 models 。等价于更改了数据库的表结构,这个时候,需要数据库同步。新建 (/db_migrate.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. import imp
  4. from migrate.versioning import api
  5. from app import db
  6. from config import SQLALCHEMY_DATABASE_URI
  7. from config import SQLALCHEMY_MIGRATE_REPO
  8.  
  9. migration = SQLALCHEMY_MIGRATE_REPO + '/versions/%03d_migration.py' % (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) + 1)
  10. tmp_module = imp.new_module('old_model')
  11. old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
  12.  
  13. exec old_model in tmp_module.__dict__
  14.  
  15. script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)

  16. open(migration, 'wt').write(script)
  17.  
  18. api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
  19.  
  20. print 'New migration saved as' + migration
  21. print 'Current database version:' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))

这个脚本看起来很复杂,SQLAlchemy-migrate通过对比数据库的结构(从app.db文件读取)和models结构(从app/models.py文件读取)的方式来创建迁移任务,两者之间的差异将作为一个迁移脚本记录在迁移库中,迁移脚本知道如何应用或者撤销一次迁移,所以它可以方便的升级或者降级一个数据库的格式。

开始数据库迁移

$ python db_mirgate.py

New migration saved as db_repository/versions/001_migration.py Current database version: 1
相应的,我们继续创建数据库 升级和回退的脚本
(/db_upgrade.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from migrate.versioning import api
  4. from config import SQLALCHEMY_DATABASE_URI
  5. from config import SQLALCHEMY_MIGRATE_REPO
  6. api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
  7. print 'Current database version:' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))

(/db_downgrade.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from migrate.versioning import api
  4. from config import SQLALCHEMY_DATABASE_URI
  5. from config import SQLALCHEMY_MIGRATE_REPO
  6.  
  7. v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
  8. api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v 1)
  9.  
  10. print 'Current database version:' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))

4 操作数据库
接下来,我们定义一个新的models class 并做第二次迁移归并
打开(/app/models.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from app import db
  4. ROLE_USER = 0
  5. ROLE_ADMIN = 1
  6.  
  7. class User(db.Model):
  8. id = db.Column(db.Integer, primary_key=True)
  9. nickname=db.Column(db.String(60), index=True, unique=True)
  10. email = db.Column(db.String(120), index=True, unique=True)
  11. role = db.Column(db.SmallInteger, default=ROLE_USER)
  12. posts = db.relationship(‘Post’, db.backref = author’, db.lazyload = dynamic’)
  13.  
  14. def __repr__(self):
  15. return ‘<User %r>’ % self.nickname
  16.  
  17. class Post(db.Model):
  18. id = db.Column(db.Integer, primary_key=True)
  19. body = db.Column(db.String(140))
  20. timestamp = db.Column(db.DateTime)
  21. user_id = db.Column(db.Integer, db.ForeignKey(‘user.id’))
  22.  
  23. def __repr__(self):
  24. return ‘<Post %r>’ % (self.body)

这里我们进行了两个class 的关联。

$ python db_mirgrate.py

New migration saved as db_repository/versions/002_migration.py Current database version: 2

打开 (/app/views.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. from flask import render_template, flash, redirect, session, url_for, request, g
  4. from app import app, db
  5. from models import User, Post, ROLE_USER, ROLE_ADMIN
  6.  
  7. @app.route(‘/’)
  8. def index():
  9. return render_template(‘index.html’)
  10.  
  11. @app.route(‘/adduser/<nickname>/<email>’)
  12. def adduser(nickname, email):
  13. u = User(nickname=nickname, email=email)
  14. try:
  15. db.session.add(u)
  16. db.session.commit()
  17. return add successful
  18. except Exception, e:
  19. return something go wrong
  20.  
  21. @app.route(‘/getuser/<nickname>’)
  22. def getuser(nickname):
  23. user = User.query.filter_by(nickname=nickname).first()
  24. return render_template(‘user.html’, user=user)
  25.  
  26. @app.errorhandler(404)
  27. def internal_error(error):
  28. return render_template(‘404.html’), 404
  29.  
  30. @app.errorhandler(500)
  31. def internal_error(error):
  32. db.session.rollback()
  33. return render_template(‘500.html’), 500

这次我们使用了模板, 新建(/app/templates/user.html)

  1. <html>
  2. <head>
  3. <title>user</title>
  4. </head>
  5. <body>
  6. <h1>user</h1>
  7. <ul>
  8. <li>user: {{ user.nickname }}</li>
  9. <li>email: {{ user.email }}</li>
  10. </ul>
  11. </body>
  12. </html>

最后运行

$ python run.py
用浏览器访问 http://127.0.0.1:5000/adduser/username/useremail
最后还可以用 sqlite 客户端打开查看我们的数据库变换。关于更多的数据库操作方法,请阅读 sqlalchemy文档。
最后我们的代码目录结构如下:

  1. (env)admin@admindeMacBook-Air:~/project/python/flask/project$ tree
  2. .
  3. ├── app
  4. ├── __init__.py
  5. ├── models.py
  6. ├── static
  7. ├── templates
  8. ├── .html
  9. ├── .html
  10. ├── index.html
  11. └── user.html
  12. ├── views.py
  13. ├── app.db
  14. ├── config.py
  15. ├── db_create.py
  16. ├── db_downgrade.py
  17. ├── db_migrate.py
  18. ├── db_repository
  19. ├── __init__.py
  20. ├── manage.py
  21. ├── migrate.cfg
  22. ├── README
  23. └── versions
  24. ├── 001_migration.py
  25. ├── 002_migration.py
  26. ├── __init__.py
  27. ├── db_upgrade.py
  28. ├── requirements.txt
  29. ├── run.py
  30. ├── tmp

5 表单
接下来,我们将要接触表单方面的内容。flask原生提供的表单处理,也比较简单。当然,有了轮子,我们就直接用好了。需要安装一个
Flask-WTF==0.9.4。
安装完之后,打开 (/app/forms.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. import re
  4. from flask_wtf import Form
  5. from flask_wtf.html5 import EmailField
  6. from wtforms import TextField, PasswordField, BooleanField
  7. from wtforms.validators import DataRequired, ValidationError
  8. from models import User
  9. from hashlib import md5
  10.  
  11. class RegisterFrom(Form):
  12. nickname = TextField(‘nickname’, validators=[DataRequired()])
  13. email = EmailField(’email’, validators=[DataRequired()])
  14. password = PasswordField(‘password’, validators=[DataRequired()])
  15. conform = PasswordField(‘conform’, validators=[DataRequired()])
  16.  
  17. def validate_nickname(self, field):
  18. nickname = field.data.strip()
  19. if len(nickname) < 3 or len(nickname) > 20:
  20. raise ValidationError(‘nickname must be 3 letter at least’)
  21. elif not re.search(r’^\w+$’, nickname):
  22. raise ValidationError(‘User names can contain only alphanumeric characters and underscores.’)
  23. else:
  24. # 验证是否已经注册
  25. u = User.query.filter_by(nickname=nickname).first()
  26. if u:
  27. raise ValidationError(‘The nickname already exists’)
  28.  
  29. def validate_email(self, field):
  30. email = field.data.strip()
  31. email = User.query.filter_by(email=email).first()
  32. if email:
  33. raise ValidationError(‘The email already exists’)
  34.  
  35. def validate_password(self, field):
  36. password = field.data.strip()
  37. if len(password) < 6:
  38. raise ValidationError(‘password must be 3 letter at least’)
  39.  
  40. def validate_conform(self, field):
  41. conform = field.data.strip()
  42. if self.data[‘password’] != conform:
  43. raise ValidationError(‘the password and conform are different’)

上述代码定义了一个 RegisterFrom class,正好是一个表单,class的字段映射为表单的域。其中 wtforms 中有 TextField, PasswordField, BooleanField这些表单类型,flask_wtf.html5 中 EmailField 则是 html5 规范的。
表单有 form.validate_on_submit() 方法,这个方法执行之前会验证表单域。验证方法和django类似,都是 validate_field 的方法。其中一个参数 field正好是表单的value值 需要注意验证两次密码是否相同的时候,需要用到 self.data 。这是一个字典,包含了表单域的name和value

6 用户注册
打开(/app/views.py)添加注册方法。

  1. @app.route(‘/account/signup’, methods=[‘GET’, POST’])
  2. def signup():
  3. form = RegisterFrom()
  4. if request.method == POST’:
  5. if form.validate_on_submit():
  6. psdmd5 = md5(form.data[‘password’])
  7. password = psdmd5.hexdigest()
  8. u = User(nickname=form.data[‘nickname’], email=form.data[’email’], password=password)
  9. try:
  10. db.session.add(u)
  11. db.session.commit()
  12. flash(‘signup successful’)
  13. except Exception, e:
  14. return something goes wrong
  15. return redirect(url_for(‘signin’))
  16.  
  17. return render_template(‘signup.html’, form=form)

模版 新建 (/app/tempaltes/signup.html)

  1. <!– extend base layout –>
  2. {% extends “base.html” %}
  3.  
  4. {% block content %}
  5. <form method=”POST” action=>
  6. {{ form.hidden_tag() }}
  7. <p>{{ form.nickname.label }} {{ form.nickname(size=20) }}</p>
  8. <p>{{ form.email.label }} {{ form.email(size=20) }}</p>
  9. <p>{{ form.password.label }} {{ form.password(size=20) }}</p>
  10. <p>{{ form.conform.label }} {{ form.conform(size=20) }}</p>
  11. <input type=”submit” value=”Sign Up>
  12. <input type=”reset” value=”Reset”>
  13. </form>
  14.  
  15. {{ form.errors }}
  16. {% endblock %}

其中,主要是用到 form 对象的一些属性。form.nickname.label 是指表单类定义的名字,form.nickname 会转变成 表单域的 html 代码 即 <input type=”text” id=”nickname” name=”nickaname” value=””/>

7 用户登录
先添加一个用户登录的表单,打开 (/app/forms.py)

  1. class LoginForm(Form):
  2. nickname = TextField(‘nickname’, validators=[DataRequired()])
  3. password = PasswordField(‘password’, validators=[DataRequired()])
  4. remember_me = BooleanField(‘remember_me’, default=False)
  5.  
  6. def validate_nickname(self, field):
  7. nickname = field.data.strip()
  8. if len(nickname) < 3 or len(nickname) > 20:
  9. raise ValidationError(‘nickname must be 3 letter at least’)
  10. elif not re.search(r’^\w+$’, nickname):
  11. raise ValidationError(‘User names can contain only alphanumeric characters and underscores.’)
  12. else:
  13. return nickname

用户登录,最简单的方法就是 验证用户名,如果通过,则添加 session,登出的时候,清除session即可,模版里面可以直接使用 request.session用来判断用户登录状态
打开(/app/views.py) 添加登录登出方法

  1. @app.route(‘/account/signin’, methods=[‘GET’, POST’])
  2. def signin():
  3. form = LoginForm()
  4. if request.method == POST’:
  5. if form.validate_on_submit():
  6. nickname = form.data[‘nickname’]
  7. psdmd5 = md5(form.data[‘password’])
  8. password = psdmd5.hexdigest()
  9. u = User.query.filter_by(nickname=nickname, password=password).first()
  10. if u:
  11. session[‘signin’] = True
  12. flash(‘signin successful’)
  13. return redirect(url_for(‘index’))
  14. else:
  15. flash(u’用户名或者密码错误’)
  16. return render_template(‘signin.html’, form=form)
  17.  
  18. @app.route(‘/account/signout’)
  19. def signout():
  20. session.pop(‘signin’, None)
  21. flash(‘signout successful’)
  22. return redirect(‘index’)

注意,我们使用 flask 的时候,用了中文,就必须是 unicode
除了原生的登录方式,我们还可以用flask-login。安装flask-login
此时需要初始化一个 login_manager 对象,打开 (/app/__init__.py)

  1. # -*- coding: utf-8 -*-
  2.  
  3. import os
  4. from flask import Flask
  5. from flask.ext.sqlalchemy import SQLAlchemy
  6. from flask.ext.login import LoginManager
  7. from config import basedir
  8.  
  9. app = Flask(__name__)

  10. app.config.from_object(‘config’)
  11.  
  12. db = SQLAlchemy(app) # 初始化数据库管理对象
  13. login_manager = LoginManager() # 初始化登录管理对象
  14. login_manager.init_app(app)
  15. login_manager.login_view = signin # 登录跳转视图
  16. login_manager.login_message = uBonvolu ensaluti por uzi tio paĝo.” # 登录跳转视图前的输出消息
  17.  
  18. # from app import views, models
  19.  
  20. import views, models

然后打开 (/app/views.py)
添加下面方法, 注释掉之前的 登入登出方法

  1. from flask.ext.login import login_user, logout_user, current_user, login_required
  2. from app import app, db, login_manager
  3.  
  4. @login_manager.user_loader
  5. def load_user(userid):
  6. return User.query.get(userid)
  7.  
  8. @app.route(‘/account/signin’, methods=[‘GET’, POST’])
  9. def signin():
  10. form = LoginForm()
  11. if request.method == POST’:
  12. if form.validate_on_submit():
  13. nickname = form.data[‘nickname’]
  14. psdmd5 = md5(form.data[‘password’])
  15. password = psdmd5.hexdigest()
  16. remember_me = form.data[‘remember_me’]
  17. user = User.query.filter_by(nickname=nickname, password=password).first()
  18. if user:
  19. login_user(user, remember = remember_me)
  20. flash(‘signin successful’)
  21. return redirect(request.args.get(“next”) or url_for(“index”))
  22. else:
  23. flash(u’用户名或者密码错误’)
  24. return render_template(‘signin.html’, form=form)
  25.  
  26. @app.route(‘/account/signout’)
  27.  
  28. @login_required
  29. def signout():
    logout_user()
  30. flash(‘signout successful’)
  31. return redirect(‘index’)

模版也会响应的改,具体看源码吧。
base.html

  1. <html>
  2. <head>
  3. <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
  4. {% if title %}
  5. <title>{{title}} – microblog</title>
  6. {% else %}
  7. <title>microblog</title>
  8. {% endif %}
  9. </head>
  10. <body>
  11. <div class="metanav">
  12.  
  13. <div>
  14. <a href=”{{ url_for(‘index’) }}”>Home</a>
  15. {% if current_user.is_authenticated() %}
  16. <a href=”{{ url_for(‘signout’) }}”>signout</a>
  17. {% else %}
  18. <a href=”{{ url_for(‘signin’) }}”>signin</a>
  19. {% endif %}
  20. </div>
  21.  
  22. {% for message in get_flashed_messages() %}
  23. <div class="flash">{{ message }}</div>
  24. {% endfor %}
  25. {% block content %}{% endblock %}
  26. </body>
  27. </html>

代码下载: https://github.com/rsj217/flask-extend/tree/master/project

Python框架 Flask 项目实战教程的更多相关文章

  1. Python NLP完整项目实战教程(1)

    一.前言 打算写一个系列的关于自然语言处理技术的文章<Python NLP完整项目实战>,本文算是系列文章的起始篇,为了能够有效集合实际应用场景,避免为了学习而学习,考虑结合一个具体的项目 ...

  2. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码

    随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...

  3. Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示

    基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...

  4. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...

  5. Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面

    1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...

  6. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  7. Python之Flask项目开发【入门必学】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:藤藤菜丶 Flask 安装Flask模块 创建一个Flask项目 运行 ...

  8. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  9. python 创建flask项目方法

    Flask是一个基于Python的web框架,它的设计目的是提供Web开发所需的最小功能子集. Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理 ...

随机推荐

  1. Sql:查看数据库表和表结构的语句

    T-sql 显示表结构和字段信息的sql语句: exec sp_help tablename; ~~使用存储过程 sp_help 显示数据库包含哪些表的sql语句: use yourDBname;se ...

  2. LeapMotion 简介

    Leap Motion Overview Leap Motion是一种检测和跟踪hands, fingers and finger-like tools的设备.该设备在一个较近的环境中操作,精度高,跟 ...

  3. Oracle中sign函数和decode函数的使用

    Oracle中sign函数和decode函数的使用 1.比较大小函数SIGN sign(x)或者Sign(x)叫做 符号函数,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1; ...

  4. 过拟合/欠拟合&logistic回归等总结(Ng第二课)

    昨天学习完了Ng的第二课,总结如下: 过拟合:欠拟合: 参数学习算法:非参数学习算法 局部加权回归 KD tree 最小二乘 中心极限定律 感知器算法 sigmod函数 梯度下降/梯度上升 二元分类 ...

  5. paip.最新的c++ qt5.1.1环境搭建跟hello world

    paip.最新的c++ qt5.1.1环境搭建跟hello world 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://bl ...

  6. 赵雅智:service_startService生命周期

    案例演示 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  7. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  8. poj2774之最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 18794   Accepted: 77 ...

  9. (待解决问题)nowrap在table和td都设置了宽度的时候仍然有效

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  10. c# 流程控制

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...