Python之flask框架_网络星空(luoc)的博客-CSDN博客_python框架flask

mikel阅读(609)

来源: Python之flask框架_网络星空(luoc)的博客-CSDN博客_python框架flask

文章目录
前言
安装flask
调试模式
路由
路径变量
构造URL
HTTP方法
静态文件
日志输出
处理请求
Request 对象
文件上传
Cookies
重定向和错误
响应处理
Sessions
模板简介
模板标签
继承
控制流
总结
前言
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。

安装flask
首先我们来安装Flask。最简单的办法就是使用pip。
pip install flask
1
然后打开一个Python文件,输入下面的内容并运行该文件。然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world。
from flask import Flask
app = Flask(__name__)

@app.route(‘/’)
def hello_world():
return ‘hello world’

if __name__ == ‘__main__’:
app.run(host=’127.0.0.1′,port=5000)
1
2
3
4
5
6
7
8
9
调试模式
我们修改代码中的输出,然后查看浏览器上是否有变化。如果你照做的话,可以看到什么变化都没有。其实Flask内置了调试模式,可以自动重载代码并显示调试信息。这需要我们开启调试模式,方法很简单,设置FLASK_Debug环境变量,并将值设置为1。或者设置app.Debug=True

from flask import Flask

app = Flask(__name__)
app.debug=True

@app.route(‘/’)
def hello_world():
return ‘Hello World!’

@app.route(‘/login’)
def login():
return ‘Login’

if __name__ == ‘__main__’:
app.run()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
然后再次运行程序,会看到有这样的输出。这时候如果再次修改代码,会发现这次Flask会自动重启。

* Restarting with stat
* Debugger is active!
* Debugger PIN: 157-063-180
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
1
2
3
4
路由
在上面的例子里可以看到路由的使用。如果了解Spring Web MVC的话,应该对路由很熟悉。路由通过使用Flask的app.route装饰器来设置,这类似Java的注解。

@app.route(‘/’)
def index():
return ‘Index Page’

@app.route(‘/hello’)
def hello():
return ‘Hello, World’
1
2
3
4
5
6
7
路径变量
如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/converter:varname。在路径变量前还可以使用可选的转换器,有以下几种转换器。

下面是Flask官方的例子。

@app.route(‘/user/<username>’)
def show_user_profile(username):
# show the user profile for that user
return ‘User %s’ % username

@app.route(‘/post/<int:post_id>’)
def show_post(post_id):
# show the post with the given id, the id is an integer
return ‘Post %d’ % post_id
1
2
3
4
5
6
7
8
9
构造URL
在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for(‘方法名’)来构造对应方法的URL。下面是Flask官方的例子。

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route(‘/’)
… def index(): pass

>>> @app.route(‘/login’)
… def login(): pass

>>> @app.route(‘/user/<username>’)
… def profile(username): pass

>>> with app.test_request_context():
… print url_for(‘index’)
… print url_for(‘login’)
… print url_for(‘login’, next=’/’)
… print url_for(‘profile’, username=’John Doe’)

/
/login
/login?next=/
/user/John%20Doe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
HTTP方法
如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。

from flask import request

@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
do_the_login()
else:
show_the_login_form()
1
2
3
4
5
6
7
8
静态文件
Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。

url_for(‘static’, filename=’style.css’)
1
模板生成
Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。

使用 Jinja 模板,只需要使用render_template函数并传入模板文件名和参数名即可。

from flask import render_template

@app.route(‘/hello/’)
@app.route(‘/hello/<name>’)
def hello(name=None):
return render_template(‘hello.html’, name=name)
1
2
3
4
5
6
相应的模板文件如下。

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
1
2
3
4
5
6
7
日志输出
Flask 为我们预配置了一个 Logger,我们可以直接在程序中使用。这个Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它,详情可以参考官方文档或者我的文章Python 日志输出。

app.logger.debug(‘A value for debugging’)
app.logger.warning(‘A warning occurred (%d apples)’, 42)
app.logger.error(‘An error occurred’)
1
2
3
处理请求
在 Flask 中获取请求参数需要使用request等几个全局对象,但是这几个全局对象比较特殊,它们是 Context Locals ,其实就是 Web 上下文中局部变量的代理。虽然我们在程序中使用的是全局变量,但是对于每个请求作用域,它们都是互不相同的变量。理解了这一点,后面就非常简单了。

Request 对象
Request 对象是一个全局对象,利用它的属性和方法,我们可以方便的获取从页面传递过来的参数。

method属性会返回HTTP方法的类似,例如post和get。form属性是一个字典,如果数据是POST类型的表单,就可以从form属性中获取。下面是 Flask 官方的例子,演示了 Request 对象的method和form属性。

from flask import request

@app.route(‘/login’, methods=[‘POST’, ‘GET’])
def login():
error = None
if request.method == ‘POST’:
if valid_login(request.form[‘username’],
request.form[‘password’]):
return log_the_user_in(request.form[‘username’])
else:
error = ‘Invalid username/password’
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template(‘login.html’, error=error)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如果数据是由GET方法传送过来的,可以使用args属性获取,这个属性也是一个字典。

searchword = request.args.get(‘key’, ”)
1
文件上传
利用Flask也可以方便的获取表单中上传的文件,只需要利用 request 的files属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug提供的secure_filename方法来获取安全的文件名。

from flask import request
from werkzeug.utils import secure_filename

@app.route(‘/upload’, methods=[‘GET’, ‘POST’])
def upload_file():
if request.method == ‘POST’:
f = request.files[‘the_file’]
f.save(‘/var/www/uploads/’ + secure_filename(f.filename))
1
2
3
4
5
6
7
8
Cookies
Flask也可以方便的处理Cookie。使用方法很简单,直接看官方的例子就行了。下面的例子是如何获取cookie。

from flask import request

@app.route(‘/’)
def index():
username = request.cookies.get(‘username’)
# 使用 cookies.get(key) 代替 cookies[key] 避免
# 得到 KeyError 如果cookie不存在
1
2
3
4
5
6
7
重定向和错误
redirect和abort函数用于重定向和返回错误页面。

from flask import abort, redirect, url_for

@app.route(‘/’)
def index():
return redirect(url_for(‘login’))

@app.route(‘/login’)
def login():
abort(401)
this_is_never_executed()
1
2
3
4
5
6
7
8
9
10
默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用errorhandler装饰器。

from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
return render_template(‘page_not_found.html’), 404
1
2
3
4
5
响应处理
默认情况下,Flask会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用make_response函数即可。

@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template(‘error.html’), 404)
resp.headers[‘X-Something’] = ‘A value’
return resp
1
2
3
4
5
Sessions
我们可以使用全局对象session来管理用户会话。Sesison 是建立在 Cookie 技术上的,不过在 Flask 中,我们还可以为 Session 指定密钥,这样存储在 Cookie 中的信息就会被加密,从而更加安全。直接看 Flask 官方的例子吧。

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

@app.route(‘/’)
def index():
if ‘username’ in session:
return ‘Logged in as %s’ % escape(session[‘username’])
return ‘You are not logged in’

@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
session[‘username’] = request.form[‘username’]
return redirect(url_for(‘index’))
return ”’
<form method=”post”>
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
”’

@app.route(‘/logout’)
def logout():
# remove the username from the session if it’s there
session.pop(‘username’, None)
return redirect(url_for(‘index’))

# set the secret key. keep this really secret:
app.secret_key = ‘A0Zr98j/3yX R~XHH!jmN]LWX/,?RT’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
模板简介
这里简单的介绍一下Jinja 模板的使用方法,详细资料直接看原文档吧。

模板标签
其实Jinja 模板和其他语言和框架的模板类似,反正都是通过某种语法将HTML文件中的特定元素替换为实际的值。如果使用过JSP、Thymeleaf 等模板,应该可以非常容易的学会使用 Jinja模板。

其实从上面的例子中我们应该可以看到Jinja 模板的基本语法了。代码块需要包含在{% %}块中,例如下面的代码。

{% extends ‘layout.html’ %}
{% block title %}主页{% endblock %}
{% block body %}

<div class=”jumbotron”>
<h1>主页</h1>
</div>

{% endblock %}
1
2
3
4
5
6
7
8
9
双大括号中的内容不会被转义,所有内容都会原样输出,它常常和其他辅助函数一起使用。下面是一个例子。

<a class=”navbar-brand” href={{ url_for(‘index’) }}>Flask小例子</a>
1
继承
模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。

例如这里有一个layout.html模板,它是整个程序的布局文件。

<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<title>{% block title %}{% endblock %}</title>
<link rel=”stylesheet” href=”{{ url_for(‘static’,filename=’css/bootstrap.css’) }}”/>
<link rel=”stylesheet” href=”{{ url_for(‘static’,filename=’css/bootstrap-theme.css’) }}”/>

</head>
<body>

<div class=”container body-content”>
{% block body %}{% endblock %}
</div>

<div class=”container footer”>
<hr>
<p>这是页脚</p>
</div>

<script src=”{{ url_for(‘static’,filename=’js/JQuery.js’) }}”></script>
<script src=”{{ url_for(‘static’,filename=’js/bootstrap.js’) }}”></script>

</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
其他模板可以这么写。对比一下面向对象编程的继承概念,我们可以很容易的理解。

{% extends ‘layout.html’ %}
{% block title %}主页{% endblock %}
{% block body %}

<div class=”jumbotron”>
<h1>主页</h1>
<p>本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。</p>
</div>

{% endblock %}
1
2
3
4
5
6
7
8
9
10
控制流
条件判断可以这么写,类似于JSP标签中的Java 代码,{% %}中也可以写Python代码。下面是Flask官方文档的例子。

<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>
1
2
3
4
5
6
7
循环的话可以这么写,和在Python中遍历差不多。

<tbody>
{% for key,value in data.items() %}
<tr>
<td>{{ key }}</td>
<td>{{ value }}</td>
</tr>
{% endfor %}
<tr>
<td>文件</td>
<td></td>
</tr>
</tbody>
1
2
3
4
5
6
7
8
9
10
11
12
需要注意不是所有的Python代码都可以写在模板里,如果希望从模板中引用其他文件的函数,需要显式将函数注册到模板中。可以参考这个爆栈提问。

总结
这篇文章主要参考了Flask的官方文档,但是只介绍了 Flask的最基本的一部分。了解了这部分,我们可以用Python 搭一个小服务器做点事情。如果希望详细了解 Flask的使用用法,请关注更详细的资料。本文就是起一个抛砖引玉的效果。

顺便说,通过Flask 我也了解了Python 语言的执行速度。我们都知道编译器编译出来的代码执行起来要比解释器解释代码要快大约几十倍到几千倍不等。以前学Java的时候,感觉Java 慢,主要原因就是等待编译时间比较长。相对来说用Python写脚本就很块了,因为没有编译过程。

但是从Flask的运行速度来看,我切身感受到了Python 执行确实不快。举个例子,在Spring中写一个控制器,接受HTTP参数,并显示到页面上,如果程序编译完之后,这个显示过程基本是瞬时的。但是同样的需求在Flask中,我居然可以感觉到明显的延迟(大概几百毫秒的等待时间)。所以,如果你想写一个比较快的Web程序,还是用Java或者JVM语言吧,虽然看着土,性能确实杠杠的 。
————————————————
版权声明:本文为CSDN博主「网络星空(luoc)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42483745/article/details/123957659

pythonFlask框架学习 - 简书

mikel阅读(567)

来源: pythonFlask框架学习 – 简书

Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。而且有对应的python3及python2版本。首先这边选择的是python3.6,虽然python3在网上好像名声不咋地,而且一度有文章说python3正在毁灭Python,但是反正是别人选的,也就将就了。

在网上看别人下载个flask很麻烦,反正我的很简单,windows环境下的

1.安装Flask

pip install flask

2.目录结构

通过别人的目录大致了解一下flask框架的目录结构。

flask-demo/
  ├ run.py           # 应用启动程序
  ├ config.py        # 环境配置
  ├ requirements.txt # 列出应用程序依赖的所有Python包
  ├ tests/           # 测试代码包
  │   ├ __init__.py 
  │   └ test_*.py    # 测试用例
  └ myapp/
      ├ admin/       # 蓝图目录
      ├ static/
      │   ├ css/     # css文件目录
      │   ├ img/     # 图片文件目录
      │   └ js/      # js文件目录
      ├ templates/   # 模板文件目录
      ├ __init__.py    
      ├ forms.py     # 存放所有表单,如果多,将其变为一个包
      ├ models.py    # 存放所有数据模型,如果多,将其变为一个包
      └ views.py     # 存放所有视图函数,如果多,将其变为一个包

3.开始 Hello world

最简单的测试

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello World'
if __name__ == '__main__':
    app.debug = True # 设置调试模式,生产模式的时候要关掉debug
    app.run()

这是flask框架制作的一个最小的应用。使用python运行后访问localhost:5000就能看到网页显示Hello world。
这里首先引入了Flask类,然后给这个类创建了一个实例,name代表这个模块的名字。因为这个模块是直接被运行的所以此时name的值是main。然后用route()这个修饰器定义了一个路由,告诉flask如何访问该函数。最后用run()函数使这个应用在服务器上运行起来。

4.模板

Flask的模板功能是基于Jinja2模板引擎实现的。让我们来实现一个例子吧。创建一个新的Flask运行文件(你应该不会忘了怎么写吧),代码如下:

from  flask import  Flask

from  flask import  render_template

app  =  Flask(__name__)

@app.route('/hello')

@app.route('/hello/<name>')

def  hello(name=None):

    return  render_template('hello.html',  name=name)

if  __name__  ==  '__main__':

    app.run(host='0.0.0.0',  debug=True)

这段代码”hello()”函数并不是直接返回字符串,而是调用了”render_template()”方法来渲染模板。方法的第一个参数”hello.html”指向你想渲染的模板名称,第二个参数”name”是你要传到模板去的变量,变量可以传多个。

那么这个模板”hello.html”在哪儿呢,变量参数又该怎么用呢?接下来我们创建模板文件。在当前目录下,创建一个子目录”templates”(注意,一定要使用这个名字)。然后在”templates”目录下创建文件”hello.html”,内容如下:

<!doctype html>

<title>Hello Sample</title>

{% if name %}

  <h1>Hello {{ name }}!</h1>

{% else %}

  <h1>Hello World!</h1>

{%  endif  %}

这段代码是不是很像HTML?接触过其他模板引擎的朋友们肯定立马秒懂了这段代码。它就是一个HTML模板,根据”name”变量的值,显示不同的内容。变量或表达式由”{{ }}”修饰,而控制语句由”{% %}”修饰,其他的代码,就是我们常见的HTML。

让我们打开浏览器,输入”http://localhost:5000/hello/man”,页面上即显示大标题”Hello man!”。我们再看下页面源代码

<!doctype html>

<title>Hello from Flask</title>

  <h1>Hello man!</h1>

果然,模板代码进入了”Hello {{ name }}!”分支,而且变量”{{ name }}”被替换为了”man”。Jinja2的模板引擎还有更多强大的功能,包括for循环,过滤器等。模板里也可以直接访问内置对象如request, session等。对于Jinja2的细节,感兴趣的朋友们可以自己去查查。

5.模板继承

一般我们的网站虽然页面多,但是很多部分是重用的,比如页首,页脚,导航栏之类的。对于每个页面,都要写这些代码,很麻烦。Flask的Jinja2模板支持模板继承功能,省去了这些重复代码。让我们基于上面的例子,在”templates”目录下,创建一个名为”layout.html”的模板:

<!doctype html>

<title>Hello Sample</title>

<link rel="stylesheet"  type="text/css"  href="{{ url_for('static', filename='style.css') }}">

<div class="page">

    {% block body %}

    {% endblock %}

</div>

再修改之前的”hello.html”,把原来的代码定义在”block body”中,并在代码一开始”继承”上面的”layout.html”:

{%  extends  "layout.html"  %}

{%  block  body  %}

{%  if  name  %}

  <h1>Hello {{ name }}!</h1>

{% else %}

  <h1>Hello World!</h1>

{%  endif  %}

{%  endblock  %}

打开浏览器,再看下”http://localhost:5000/hello/man”页面的源码。

<!doctype html>

<title>Hello Sample</title>

<link rel="stylesheet"  type="text/css"  href="/static/style.css">

<div class="page">

  <h1>Hello man!</h1>

</div>

你会发现,虽然”render_template()”加载了”hello.html”模板,但是”layout.html”的内容也一起被加载了。而且”hello.html”中的内容被放置在”layout.html”中”{% block body %}”的位置上。形象的说,就是”hello.html”继承了”layout.html”。

6. HTML自动转义

我们看下下面的代码:

@app.route('/')

def  index():

    return  '<div>Hello %s</div>'  %  '<em>Flask</em>'

打开页面,你会看到”Hello Flask”字样,而且”Flask”是斜体的,因为我们加了”em”标签。但有时我们并不想让这些HTML标签自动转义,特别是传递表单参数时,很容易导致HTML注入的漏洞。我们把上面的代码改下,引入”Markup”类:

from  flask import  Flask,  Markup

app  =  Flask(__name__)

@app.route('/')

def  index():

    return  Markup('<div>Hello %s</div>')  %  '<em>Flask</em>'

再次打开页面,”em”标签显示在页面上了。Markup还有很多方法,比如”escape()”呈现HTML标签, “striptags()”去除HTML标签。这里就不一一列举了。

7.Request 对象

from flask import Flask,url_for,request,render_template

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['user'] == 'admin':
            return 'Admin login successfully!'
        else:
            return 'No such user!'
    title = request.args.get('title', 'Default')
    return render_template('login.html', title=title)
if __name__ == "__main__":
    app.run(debug=True)

简单解释下,request中”method”变量可以获取当前请求的方法,即”GET”, “POST”, “DELETE”, “PUT”等;”form”变量是一个字典,可以获取Post请求表单中的内容,在上例中,如果提交的表单中不存在”user”项,则会返回一个”KeyError”,你可以不捕获,页面会返回400错误(想避免抛出这”KeyError”,你可以用request.form.get(“user”)来替代)。而”request.args.get()”方法则可以获取Get请求URL中的参数,该函数的第二个参数是默认值,当URL参数不存在时,则返回默认值。

在当前目录下,创建一个子目录”templates”(注意,一定要使用这个名字)。然后在”templates”目录下,添加
layout.html

<!doctype html>
<title>Hello Sample</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<div class="page">
    {% block body %}
    {% endblock %}
</div>

login.html

{% extends "layout.html" %}
{% block body %}
<form name="login" action="/login" method="post">
    Hello {{ title }}, please login by:
    <input type="text" name="user" />
</form>
{% endblock %}
图片.png
图片.png

8.会话session

会话可以用来保存当前请求的一些状态,以便于在请求之前共享信息。

from flask import Flask,url_for,request,render_template,redirect,session
@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['user'] == 'admin':
            session['user'] = request.form['user']
            return 'Admin login successfully!'
        else:
            return 'No such user!'
    if 'user' in session:
        return 'Hello %s!' % session['user']
    else:
        title = request.args.get('title', 'Default')
        return render_template('login.html', title=title)
@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

app.secret_key = '123456'
if __name__ == "__main__":
    app.run(debug=True)

你可以看到,”admin”登陆成功后,再打开”login”页面就不会出现表单了。然后打开logout页面可以登出。session对象的操作就跟一个字典一样。特别提醒,使用session时一定要设置一个密钥”app.secret_key”,如上例。不然你会得到一个运行时错误,内容大致是”RuntimeError: the session is unavailable because no secret key was set”。密钥要尽量复杂,最好使用一个随机数,这样不会有重复,上面的例子不是一个好密钥。

9.构建响应

在之前的例子中,请求的响应我们都是直接返回字符串内容,或者通过模板来构建响应内容然后返回。其实我们也可以先构建响应对象,设置一些参数(比如响应头)后,再将其返回。修改下上例中的Get请求部分:

from flask import Flask,url_for,request,render_template,redirect,session,make_response

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        ...
    if 'user' in session:
        ...
    else:
        title = request.args.get('title', 'Default')
        response = make_response(render_template('login.html', title=title), 200)
        response.headers['key'] = 'value'
        return response
if __name__ == "__main__":
    app.run(debug=True)

打开浏览器调试,在Get请求用户未登录状态下,你会看到响应头中有一个”key”项。”make_response”方法就是用来构建response对象的,第二个参数代表响应状态码,缺省就是200。

图片.png

10.Cookie的使用

提到了Session,当然也要介绍Cookie喽,毕竟没有Cookie,Session就根本没法用(不知道为什么?查查去)。Flask中使用Cookie也很简单:

from flask import Flask,url_for,request,render_template,redirect,session,make_response
import time
@app.route('/login', methods=['POST', 'GET'])
def login():
    response = None
    if request.method == 'POST':
        if request.form['user'] == 'admin':
            session['user'] = request.form['user']
            response = make_response('Admin login successfully!')
            response.set_cookie('login_time', time.strftime('%Y-%m-%d %H:%M:%S'))
        ...

    else:
        if 'user' in session:
            login_time = request.cookies.get('login_time')
            response = make_response('Hello %s, you logged in on %s' % (session['user'], login_time))
        ...

    return response
app.secret_key = '123456'
if __name__ == "__main__":
    app.run(debug=True)

这次我们引入了”time”模块来获取当前系统时间。我们在返回响应时,通过”response.set_cookie()”函数,来设置Cookie项,之后这个项值会被保存在浏览器中。这个函数的第三个参数(max_age)可以设置该Cookie项的有效期,单位是秒,不设的话,在浏览器关闭后,该Cookie项即失效。

在请求中,”request.cookies”对象就是一个保存了浏览器Cookie的字典,使用其”get()”函数就可以获取相应的键值。

图片.png

11.错误处理

使用”abort()”函数可以直接退出请求,返回错误代码:

rom flask import Flask,abort

app = Flask(__name__)
@app.route('/error')
def error():
    abort(404)

if __name__ == "__main__":
    app.run(debug=True)

上例会显示浏览器的404错误页面。有时候,我们想要在遇到特定错误代码时做些事情,或者重写错误页面,可以用下面的方法:

rom flask import Flask,abort

app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404
if __name__ == "__main__":
    app.run(debug=True)
图片.png

不过,在实际开发过程中,我们并不会经常使用”abort()”来退出,常用的错误处理方法一般都是异常的抛出或捕获。装饰器”@app.errorhandler()”除了可以注册错误代码外,还可以注册指定的异常类型。让我们来自定义一个异常:

class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=400):
        Exception.__init__(self)
        self.message = message
        self.status_code = status_code


@app.errorhandler(InvalidUsage)
def invalid_usage(error):
    response = make_response(error.message)
    response.status_code = error.status_code
    return response
@app.route('/exception')
def exception():
    raise InvalidUsage('No privilege to access the resource', status_code=403)
if __name__ == "__main__":
    app.run(debug=True)
图片.png

我们在上面的代码中定义了一个异常”InvalidUsage”,同时我们通过装饰器”@app.errorhandler()”修饰了函数”invalid_usage()”,装饰器中注册了我们刚定义的异常类。这也就意味着,一但遇到”InvalidUsage”异常被抛出,这个”invalid_usage()”函数就会被调用。

12.url重定向

Flask的URL规则是基于Werkzeug的路由模块。模块背后的思想是基于 Apache 以及更早的 HTTP 服务器主张的先例,保证优雅且唯一的 URL。

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

访问第一个路由不带/时,Flask会自动重定向到正确地址。
访问第二个路由时末尾带上/后Flask会直接报404 NOT FOUND错误。

重定向”redirect()”函数的使用在上面例子中已有出现。作用就是当客户端浏览某个网址时,将其导向到另一个网址。常见的例子,比如用户在未登录时浏览某个需授权的页面,我们将其重定向到登录页要求其登录先。

from flask import session, redirect
 
@app.route('/')
def index():
    if 'user' in session:
        return 'Hello %s!' % session['user']
    else:
        return redirect(url_for('login'), 302)

“redirect()”的第二个参数时HTTP状态码,可取的值有301, 302, 303, 305和307,默认即302(为什么没有304?留给大家去思考)。
转载来源:思诚之道

作者:BerL1n
链接:https://www.jianshu.com/p/6452596c4edb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python 里最强的Web框架,早就不是Django和Flask了_腾讯新闻

mikel阅读(593)

来源: Python 里最强的Web框架,早就不是Django和Flask了_腾讯新闻

如果说要用 Python 进行 web 开发,我想你一定会告诉我 使用 Flask 或者 Django 再或者 tornado, 用来用去无非就这三种框架。可能逛 github 多的朋友还会说一个 fastapi。但是,皇上,时代变了,大清… 亡了!!!

速度为先

当下,python都已经更新到了 Python3.9.3 了,如果你还没有使用过 asyncio、和 Python3.5 新增的 async/await 语法,那说明你可能真的是桃花源人,问今是何世,不知有汉,无论魏晋了。

在当下,基于 async/await 语法的异步 Web 框架也有很多,在 github 上找一找比比皆是是,那究竟应该选哪一款呢?在 github 上有一个专门测试各种语言各种 Web 框架速度的项目,我们来看一看简单的数据:

这是所有的 Python Web 框架速度测试,有人可能会问为什么不是从 1 开始排序的,因为这个项目的测试还包含 golang、java、php 等众多语言的 Web 框架,共有 226 款。这里我们只用 Python 来做对比。

可以明显的看到,flask、django、tornado 等老牌的 Python Web 框架已经快要垫底了。

wow, 这个速度绝了。可能你们还在怀疑这个速度如何测试的,给你们看一下测试源码:

就是简单的不做任何操作,只返回响应,虽然这样测试没有任何实际意义,在正常的生产环境中不可能什么都不做,但是如果所有的框架都如此测试,也算是从一定程度上在同一起跑线上了吧。

OK,就这么多,说到这里你也应该知道我想要说的这个异步框架是谁了,没错,我们今天的主角就是Sanic

为什么要用异步 Web 框架?

这可能是众多小伙伴最先想到的问题了吧?我用 Django、Flask 用的好好的,能够完成正常的任务,为什么还要用异步 Web 框架呢?

说到这里,首先我要反问你你一个问题,你认为在 Web 开发过程中我们最大的敌人是谁?思考 5 秒钟,然后看看我的回答:

在 Web 开发的过程中,我们最大的敌人不是用户,而是阻塞!

是的,而异步可以有效的解决 网络 I/O 阻塞,文件 I/O 阻塞。具体的阻塞相关的文章推荐查看深入理解 Python 异步编程。由于异步可以提升效率,所以对于 Python 来说,异步是最好的提升性能的方式之一。这也是为什么要选择 异步 Web 框架的原因。

生态环境

可能有的小伙伴还是会说,你为什么不推荐 falcon 而是推荐 Sanic ?明明它的速度非常快,要比 Sanic 快了那么多,那您看一下下面的代码:

一个状态码都要自己定义和填写的框架,我想它的速度快是值得肯定的,但是对于开发者来说,又有多少的实用价值呢?所以我们选择框架并不是要选最快的,而是要又快又好用的。

而大多数框架并不具备这样的生态环境,这应该也是为什么大多数 Python 的 Web 开发者愿意选择 Django 、 Flask 、 tornado 的原因。就是因为它们的生态相对于其他框架要丰富太多太多。

可是,如今不一样了。Sanic 框架, 从 2016 年 5 月开始 发布了第一版异步 Web 框架雏形,至今已经走过了 5 个年头,这 5 年,经过不断地技术积累,Sanic 已经由一个步履蹒跚的小框架变成了一个健步如飞的稳重框架。

在 awesome-sanic 项目中,记录了大量的第三方库,你可以找到任何常用的工具:从 API 到 Authentication,从 Development 到 Frontend,从 Monitoring 到 ORM,从 Caching 到 Queue… 只有你想不到的,没有它没有的第三方拓展。

生产环境

以前我在国内的社区中看到过一些小伙伴在问 2020 年了,Sanic 可以用于生产环境了吗?

答案是肯定的,笔者以亲身经历来作证,从19年底,我们就已经将 Sanic 用于生产环境了。彼时的 Sanic 还是 19.9,笔者经历了 Sanic 19.9 — 21.3 所有的 Sanic 的版本,眼看着 Sanic 的生态环境变得越来越棒。

还有一个问题可能你们不知道,Sanic 在创建之初目标就是创建一个可以用于生产环境的 Web 框架。可能有些框架会明确的说明框架中自带的 Run 方法仅用于测试环境,不要使用自带的 Run 方法用于部署环境。但是 Sanic 所创建的不止是一个用于测试环境的应用,更是可以直接用在生产环境中的应用。省去了使用 unicorn 等部署的烦恼!

文档完善

想必大多数 Python 的 Web 开发者 学的第一个框架就是 Flask 或者 Django 吧,尤其是 Django 的文档,我想大多数小伙伴看了都会心塞。因为旧的版本有中文,但是新的版本,尤其是新特性,完全没有任何中文文档了!!!!这对于关注 Django 发展但英文又不是强项的同学来说,简直苦不堪言。

但 Sanic 拥有完善的 中文用户指南 和 API 文档,这些都是由贡献者自主发起的,官方承认的文档,由翻译者进行翻译贡献,由 Sanic 官方团队进行发布。或许有的小伙伴会说 Flask 也有完善的中文文档,但是那是在不同的站点上的,Sanic 的所有文档都有 Sanic 官方进行发布支持。且目前 Sanic 还在持续支持 韩语、葡萄牙语等更多的语种。

社区指导

和其他框架不同,您或许能够在百度上找到论坛、频道等,但这些都是经过本地汉化的,运营者往往并不是官方,且其中夹杂了很多广告。很显然,如果是官方运营的不可能允许这种情况出现。

Sanic 不同于其他的社区,所有的论坛、频道完全由官方运营,在这里,你可以向核心开发者提问问题,Sanic 的官方发布经理也非常乐意回答各种问题。你也可以和志同道合的使用者分享自己的使用经验。这是一个完全开放的环境….

Sanic 目前常用的有 论坛、Discord、github issues、twitter、Stackoverflow

大家可以在以上的方式中关注 Sanic 的发展以及寻求社区帮助。

你还在等什么?还不赶紧去试一下?最后,以 Sanic 的愿景结尾:Build Faster, Run Faster !

用VScode配置Python开发环境 - 知乎

mikel阅读(1058)

来源: 用VScode配置Python开发环境 – 知乎

前言

VScode是一个相当优秀的IDE,具备开源、跨平台、模块化、插件丰富、启动时间快、颜值高、可高度定制等等优秀的特质,不愧是微软爸爸的私生子。
所以用VScode来编写Python,也是相当的好用的。
所以,今天我们就来讲讲,怎么在VScode上配置Python开发环境。

软件准备

首先,我们必须先下载好Python的安装包和VScode的安装包。
下载地址如下:
Python:https://www.python.org/downloads/
VScode:https://code.visualstudio.com/
大家选择适合自己的版本下载即可。
我是Windows10 64位的操作系统,所以我Python下的是64位的最新版,VSco’de下载的是64位的最新版。
在这里我推荐大家选择Python3,而不是Python2.7,不过就算你下载的Python2.7此教程依旧适用。

软件安装

安装python

首先,我们安装Python到自己的电脑里。
切记,一定要记得勾选添加环境变量。
不然还得手动去配置python的环境变量。
具体的安装过程如图。

动图封面

检查python是否安装成功

然后,我们需要检查下python是否安装成功。
检查方法如下:
1、打开cmd,输入python,点击回车。
2、输入import this,欣赏下python之禅。
3、退出、输入pip list,检查第三方的包正确不。
具体过程如图。

动图封面

安装第三方的包

通过python自带的pip工具,安装两个一会儿配置VScode需要的包。
flake8和yapf
flake8会检查编写代码时的不规范的地方和语法错误。
yapf是一个代码格式化工具,可以一键美化代码。
安装过程如下:
1、在cmd输入pip list检查是否已存在需要的包
2、输入pip install flake8下载安装flake8
3、输入pip install yapf下载安装yapf
具体过程如图。

动图封面

安装VScode

安装VScode就很简单了,一路NEXT就可以了。
如图所示:

动图封面

配置VScode

安装python插件。

1、打开VScode,按下快捷键Ctrl+Shift+X,进入插件管理页面。
2、在搜索栏输入python。
3、选择插件,点击安装。

动图封面

创建项目,配置工作区域

1、创建一个本地文件夹,作为项目文件。

2、配置工作区域

配置flake8和yapf并关闭pylint工具。
在工作区域输入以下内容:

{
    "python.linting.flake8Enabled": true,
    "python.formatting.provider": "yapf",
    "python.linting.flake8Args": ["--max-line-length=248"],
    "python.linting.pylintEnabled": false
}

3、编写python文件

新建一个python文件,输入一句

print("Hello VScode")

连续按两次F5执行文件。
如图所示:

动图封面

4、配置python编译设置

连续按两次F5是不是特别不习惯,没事,我们来改掉它!
很简单只需要将launch.json文件的 “stopOnEntry”: true,改为 “stopOnEntry”: false。
如图所示:

动图封面

代码格式化工具yapf

在VSCode中按下快捷键Alt+Shift+F即可自动格式化代码
操作起来特别简单,给大家简单的演示下。
如图:

动图封面

其他

到这里,整个VScode编写Python的开发环境就已经全部配置完成了。
接下来,大家可以自行配置一些个性化的东西。
比如文件图标,主题等等。
在这里给大家推荐一个好看的主题,Hopscotch (Official)
PS.主题的安装方法和插件是一样的。
下一篇,我会教大家如何在VScode里配置git,并在GitHub上同步代码。\

.Net6+Furion+Sqlsugar+SenparcSdk开发微信公众号系列之二:搭建项目 - HuTiger - 博客园

mikel阅读(886)

来源: .Net6+Furion+Sqlsugar+SenparcSdk开发微信公众号系列之二:搭建项目 – HuTiger – 博客园

一、技术选型

语言:.Net6

脚手架:Furion

Orm:SQLsugar

SDK:Senparc.Weixin.MP

二、为什么要用SQLsugar和Furion

因为TM的太好用了,不用自己造轮子了,只要会开车就行了,而且文档是我见过最全的,公司现在也是全部用SQLsugar+Furion开发项目。

Sqlsugar

SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,

1.  .NET中唯一支持全自动分表组件,SAAS分库,大数据处理的ORM

2.  .NET 百万级写入、更新  性能最强框架

3.  使用最简单的ORM 【文档,视频教程

4.媲美原生的极限的性能

5.Github star数仅次于EF 和 Dapper,每月nuget下载量超过1万

更多优点: 简单易用、功能齐全、高性能、轻量级、服务齐全、官网教程文档、有专业技术支持一天18小时服务

支持数据库MySql、SQLServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓、神通数据库、Access 、MySqlConnector、自定义扩展

Furion

## 🍎 框架特点

– 全新面貌:基于 `.NET5/6` 平台,没有历史包袱

– 极少依赖:框架只依赖两个第三方包 – 极易入门:只需要一个 `Inject()` 即可完成配置

– 极速开发:内置丰富的企业应用开发功能

– 极其灵活:轻松面对多变复杂的需求

– 极易维护:采用独特的架构思想,只为长久维护设计

– 完整文档:提供完善的开发文档

– **跨全平台:支持所有主流操作系统及 .NET 全部项目类型**

三、搭建项目

1.安装Furion脚手架

参考官网文档

 

在要创建项目的目录打开cmd安装并创建项目,文档中是mvc项目这里我们要改成Api项目

 2.配置项目

关于项目架构说明可以直接去看Furion的文档,这里就不说明了。我们这里用的orm是sqlsugar,所以这两个efcore项目不需要,直接移除,移除后本地也直接删掉

删除IIS配置

取消https,直接http就行

修改一下Swagger的配置,在WeiXinApi.Application中的配置文件applicationsettings.json

修改启动端口在program.cs

设置WeiXinApi.Web.Entry项目为启动项,直接启动项目,可以看到直接弹出了Swagger页面,ok,项目搭建完成!

 

微服务是什么? - 阮一峰的网络日志

mikel阅读(625)

来源: 微服务是什么? – 阮一峰的网络日志

作者: 阮一峰

日期: 2022年4月29日

微服务(microservice)是一种软件架构,正得到越来越多的关注。

但是,它到底是什么意思?什么样的架构可以叫做微服务?

网上的文章虽然很多,但是都太复杂,初学者不容易看懂。我认为,这个概念其实非常简单,可以很通俗地说明白。

一、单体软件

要理解微服务,首先需要理解软件架构的演变。

早期的软件,所有功能都写在一起,这称为单体架构(monolithic software)。

整个软件就是单一的整体,彷佛一体化的机器。

可以想到,软件的功能越多,单体架构就会越复杂,很多缺点也随之暴露出来。

(1)所有功能耦合在一起,互相影响,最终难以管理。

(2)哪怕只修改一行代码,整个软件就要重新构建和部署,成本非常高。

(3)因为软件做成了一个整体,不可能每个功能单独开发和测试,只能整体开发和测试,导致必须采用瀑布式开发模型。

以上三个原因的详细分析,可以参考我以前的文章《软件工程的最大难题》

总之,单体架构的大型软件,不仅开发速度慢,而且会形成难以维护和升级的复杂代码,成为程序员的沉重负担。

二、面向服务架构

为了解决上面这些问题,很早就有人提出来,必须打破代码的耦合,拆分单体架构,将软件拆分成一个个独立的功能单元。

大概在20多年前,随着互联网的出现,功能单元可以用远程”服务”的形式提供,就诞生出了”面向服务架构”(service-oriented architecture,简称 SOA)。

所谓服务(service),就是在后台不间断运行、提供某种功能的一个程序。最常见的服务就是 Web 服务,通过80端口向外界提供网页访问。

“面向服务架构”就是把一个大型的单体程序,拆分成一个个独立服务,也就是较小的程序。每个服务都是一个独立的功能单元,承担不同的功能,服务之间通过通信协议连在一起。

这种架构有很多优点。

(1)每种服务功能单一,相当于一个小型软件,便于开发和测试。

(2)各个服务独立运行,简化了架构,提高了可靠性。

(3)鼓励和支持代码重用,同一个服务可以用于多种目的。

(4)不同服务可以单独开发和部署,便于升级。

(5)扩展性好,可以容易地加机器、加功能,承受高负载。

(6)不容易出现单点故障。即使一个服务失败了,不会影响到其他服务。

跟单体架构不一样,面向服务架构是语言不敏感的,不同服务可以使用不同的语言和工具开发,可能需要部署在不同的系统和环境。

这意味着,面向服务架构默认运行在不同服务器上,每台服务器提供一种服务,多台服务器共同组成一个完整的网络应用。

三、微服务

2014年,Docker 出现了,彻底改变了软件开发的面貌。它让程序运行在容器中,每个容器可以分别设定运行环境,并且只占用很少的系统资源。

显而易见,可以用容器来实现”面向服务架构”,每个服务不再占用一台服务器,而是占用一个容器。

这样就不需要多台服务器了,最简单的情况下,本机运行多个容器,只用一台服务器就实现了面向服务架构,这在以前是做不到的。这种实现方式就叫做微服务。

简单说,微服务就是采用容器技术的面向服务架构。它依然使用”服务”作为功能单元,但是变成了轻量级实现,不需要新增服务器,只需要新建容器(一个进程),所以才叫做”微服务”。

一个微服务就是一个独立的进程 这个进程可以运行在本机,也可以运行在别的服务器,或者在云端(比如云服务和云函数 FaaS)。

它的特点与面向服务架构是一样的,但因为更轻量级,所以功能的解耦和服务化可以做得更彻底。而且,它可以标准化,同样的容器不管在哪里运行,结果都是一样的,所以市场上有很多 SaaS 产品,提供标准化的微服务。

正是由于微服务这些突出的优点,这几年才会变得如此流行。它和容器技术、云服务一起,一定会在未来的软件开发中,扮演越来越重要的角色。

(完)

如何选择开源许可证?

mikel阅读(699)

作者: 阮一峰

日期: 2011年5月 2日

如何为代码选择开源许可证,这是一个问题。

世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种—-GPLBSDMITMozillaApacheLGPL—-之中做选择,也很复杂。

乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间的最大区别。

下面是我制作的中文版,请点击看大图。

(完)

vue-cli-service不是内部或外部命令,也不是可运行的程序_易意逸的博客-CSDN博客_vue-cli-service 不是内部或外部命令

mikel阅读(737)

来源: vue-cli-service不是内部或外部命令,也不是可运行的程序_易意逸的博客-CSDN博客_vue-cli-service 不是内部或外部命令

报错信息: “不是内部或外部命令,也不是可运行的程序”
步骤一: 检查package.json 中是否有 vue-cli-server,没有则需安装

步骤二 : 执行npm install命令

步骤三: 执行npm run dev 命令,查看程序是否运行正常

步骤四: 如果仍有异常,则检查是否有 node modules 文件有则删除 ;重新安装 node modules;
如果没有 则 单独安装 vue-cli-service;npm install vue-cli-service -S
————————————————
版权声明:本文为CSDN博主「易意逸」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43170297/article/details/107039529

连接远程计算机提示:“这可能是由于CredSSP加密数据库修正” 问题_侣行G_X_N的博客-CSDN博客_这可能是由于credssp加密数据库修正

mikel阅读(611)

来源: 连接远程计算机提示:“这可能是由于CredSSP加密数据库修正” 问题_侣行G_X_N的博客-CSDN博客_这可能是由于credssp加密数据库修正

1. 问题描述
windows系统更新,改变了数据库的加密配置,如下图:

2. win + R,输入gpedit.msc,打开本地组策略编辑器
2.1 操作步骤:计算机配置–>管理模板->系统–>凭据分配–>加密数据库修正

2.2 下图为双击加密数据库凭证后展示的页面,设置已启用,保护级别设置为易受攻击

2.3 修改完成后再次验证,已经可以正常的连接远程桌面了。

————————————————
版权声明:本文为CSDN博主「侣行G_X_N」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/G_x_n/article/details/113278711

搭建自己的低代码平台 - 菜菜聊架构 - 博客园

mikel阅读(652)

来源: 搭建自己的低代码平台 – 菜菜聊架构 – 博客园

2021 开年“低代码”成了热门话题,各大云厂商都在加码。作为普通企业的我们是否有也可以深度定制一套自己的“低代码”平台呢?

2|0二、云厂商的低代码平台

阿里推出了易搭,通过简单的拖拽、配置,即可完成业务应用的搭建。旨在为广大中小企业提供一套低成本的企业应用搭建解决方案。应用无缝植入钉钉企业工作台,随时随地、高效协同。

基于 magic-api 搭建自己的低代码平台

腾讯则是推出了微搭,通过行业化模板、拖放式组件和可视化配置快速构建多端应用(小程序、H5 应用、Web 应用等),打通了小程序、云函数。

基于 magic-api 搭建自己的低代码平台

3|0三、搭建我们自己的低代码平台?!

回到前言中的问题,我们是否可以基于开源项目来快速搭建我们自己的低代码平台呢?答案是肯定的,目前已经有很多非常不错的开源项目,apijson、dataway 还有后面我要重点介绍的 magic-api 都是非常不错的低代码开源项目。下面大家请跟着我一起来看看今天我要推荐的三个低代码开源项目:百度 amis、h5-Dooring 和 magic-api。

4|03.1 百度 amis(前端)

百度 amis 是一套前端低代码框架,通过 JSON 配置就能生成各种后台页面,极大减少开发成本,甚至可以不需要了解前端。

基于 magic-api 搭建自己的低代码平台

5|03.2 h5-Dooring(前端)

h5-Dooring,让 H5 制作像搭积木一样简单, 轻松搭建 H5 页面, H5 网站, PC 端网站, 可视化设计。

H5 页面拖拽生成:

基于 magic-api 搭建自己的低代码平台

新建数字大屏:

基于 magic-api 搭建自己的低代码平台

数字大屏效果:

基于 magic-api 搭建自己的低代码平台

更多请查看官网 http://h5.dooring.cn

6|03.3 magic-api(后端)

magic-api 是一个基于 Java 的接口快速开发框架,编写接口将通过 magic-api 提供的 UI 界面完成,自动映射为 HTTP 接口,无需定义 Controller、Service、Dao、Mapper、XML、VO 等 Java 对象即可完成常见的 HTTP API 接口开发。

在线开发调试 UI:

基于 magic-api 搭建自己的低代码平台

7|0四、magic-api 搭建

自 magic-api 在开源中国开源,笔者一直在关注此项目。magic-api 搭建比较简单,跟着官方仓库快速开始即可。

8|04.1 加入依赖

<!– 以 spring-boot-starter 的方式引用 –> <dependency> <groupId>org.ssssssss</groupId> <artifactId>magic-api-spring-boot-starter</artifactId> <version>1.3.9</version> </dependency>

9|04.2 添加配置

server.port=9999 #配置 web 页面入口 magic-api.web=/magic/web #配置文件存储位置。当以 classpath 开头时,为只读模式 magic-api.resource.location=/data/magic-api

10|04.3 效果

基于 magic-api 搭建自己的低代码平台

11|04.4 添加接口

基于 magic-api 搭建自己的低代码平台

点击执行就可以看到效果,这里不做展示,magic-api 官方做了大量的各种各样的功能演示,大家可以去体验体验。地址:
http://140.143.210.90:9999/magic/web/index.html

基于 magic-api 搭建自己的低代码平台

12|04.5 magic-api 核心之 magic-script

magic-api 底层使用的是作者(小东)自研的 magic-script 来执行脚本,他是一个语法类似 js 的 JVM 脚本语言。作者开发很多好用的功能, 其中的 linq 功能就是非常的一个。

示例:

var list = [{ sex : 0, name : ‘小明’ },{ sex : 1, name : ‘小花’ }] return select * from list t where t.sex = 0

结果:

{ “sex”: 0, “name”: “小明” }

13|0五、结合 mica 使用

14|05.1 加入 mica-bom 依赖

<dependencyManagement> <dependencies> <dependency> <groupId>net.dreamlu</groupId> <artifactId>mica-bom</artifactId> <version>${mica.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

15|05.2 mica-logging 无缝接入

mica-logging 的接入比较简单加入依赖即可:

基于 magic-api 搭建自己的低代码平台

注意:更多配置,如 json 日志和 logstash 日志收集请查看 mica 文档。

16|05.3 mica-captcha 验证码

base64 验证码:

基于 magic-api 搭建自己的低代码平台

17|05.4 mica-ip2region ip 转位置信息

基于 magic-api 搭建自己的低代码平台

示例项目源码:
https://gitee.com/596392912/magic-api-example

从 mica 的接入可以看出,magic-api 的扩展性非常好,更多的自定义配置和扩展我们可以查看 官方文档 :

基于 magic-api 搭建自己的低代码平台

18|0六、低代码开源

19|0前端:

amis(百度前端低代码框架):
https://github.com/baidu/amis

Sortable: https://github.com/SortableJS/Sortable

码良:
https://gitee.com/ymm-tech/gods-pen

h5-Dooring: https://github.com/MrXujiang/h5-Dooring

20|0后端:

apijson: https://github.com/Tencent/APIJSON

dataway: https://gitee.com/zycgit/hasor

magic-api: https://gitee.com/ssssssss-team/magic-api

21|0七、总结

基于 magic-api 等开源项目我们也可以搭建自己的低代码平台。当然开发这个低代码平台我们还是需要些工作量,主要是打通 web ui 和后端接口的 api。笔者曾经也经历过一个电商项目,很多活动都是周五下午接到需求,周一就必须要上线。借助 magic-api 这类低代码工具我们可以快速完成这类需求。最后,希望这篇文章对大家有所启发。