续--Flask, Django - 区别

1. 目录结构         参考:https://blog.csdn.net/yang9520/article/details/79740374   

  1. 中文文档(http://docs.jinkan.org/docs/flask/)

一般情况下,Django很系统、统一。Flask项目目录风格不同一,即使用上了蓝图。

2. 数据库迁移

Flask要用第三方extensions,而Django自带,这个很方便。

3. 模块化

Flask是用蓝图。Django可以自动生成python manage.py startapp <app_name>,并在Django的项目的settings那个INSTALLED_APPS字典里注册一下就好。

4. 命令行

Django的命令行初始更多功能,例如migrate。但Flask自定义命令很简单。
启动方面,Flask有两种,一种是通过manage.py帮助脚本去运行,另一种是export环境变量,用flask run来运行,官方文档建议后面这种,1.02版本还新增了一个环境变量FLASK_ENV。因为Flask依赖5个包,其中一个是click,所以可以自定义CMD。

@app.cli.command()
def hello():click.echo('Hello, xxx!') flask hello

5. 新建模型方面差不多。

它们都是继承ORM的Model。建模之后都是要加入到数据库中,就是做一个数据库迁移操作。
Flask是传入想要创建的字段类型到model.Column,而Django有明显的类给你使用,例如models.charField。

6. 反向获取URL

urlpatterns = [ path('', views.post_list, name='post_list') ]

这个name,相当于Flask的endpoint。意思都是通过反向这个名字,reverse(name)去获得URL。

// 在模板中
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1> //Django {% url_for('") %} // Flask

7. 路由

Django的路由和view functions是分开写的:urls.py, views.py。而Flask是都写在views.py中,view function和url写在一起(以装饰器的形式app.route)。
因为Django是MTV模式。其实和MVC模式差不多。大致上是Controller变成了views.py和urls.py。

Flask命令行中使用flask routes可以查看URL与view function的映射关系。代码中使用app.url_map可以查看。

8. 中间件使用

Django在settings.py里设置,
Flask要初始化中间件实例,然后传入app(Flask)实例。

9. Request对象

Django中,每个view function或者CBV中都要写一个request参数。而Flask的view function则不用,因为

from flask import request# 这个request是对每个请求独立的,就像g变量。值得研究底层原理(Flask通过本地线程( thread local) 技术将请求对象在特定
的线程和请求中全局可访问)

10. 限制http请求方法

Flask

@app.route('/hello', methods=['GET', 'POST'])
def hello(): return '<h1>Hello, Flask!</h1>'

Django

from django.views.decorators.http import require_http_methods
@require_http_methods(['GET','POST'])
def login(request): pass

11. 钩子函数

Flask,加钩子装饰器

@app.before_request
def do_something(): pass # 这里的代码会在每个请求处理前执行

Django,通过中间件

框架之间的差别

  • Django功能大而全,Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩展的形式进行嵌入使用。

  • Flask 比 Django 更灵活 用Flask来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM(Object-Relational Mapping 对象关联映射),或者需要与不同的工作流和模板系统交互。

  • Flask 在 Django 之后发布,现阶段有大量的插件和扩展满足不同需要 Django发布于2005年,Flask创始于2010年年中。

入门引导

Flask的Hello World应用的代码是最简单的,只用在一个Python文件里码7行代码就够了。

复制代码
from flask import Flask 
app = Flask(__name__) @app.route("/")
def hello(): return "Hello World!" if __name__ == "__main__":app.run()
复制代码

 

上面代码就已经是一个简单的 web 应用,从上面的 Hello World 应用的特点来看,一个没什么Python web开发经验的人就可以很快的上手开始撸代码。

项目区别

Django 创建项目和创建应用

django-admin startproject hello_django 
django-admin startapp howdy

 

其目录结构: 

默认情况下,Django项目和应用创建好了之后,只包含空的模型和模板文件,而Flask创建项目之后,目录里面没有任何文件,需要我们手动创建,是没有像Django一样组件分离,而对于需要把组件分离开的项目,Flask有blueprints。例如,你可以这样构建你的应用,将与用户有关的功能放在user.py里,把与销售相关的功能放在ecommerce.py里。

Django把一个项目分成各自独立的应用,而Flask认为一个项目应该是一个包含一些视图和模型的单个应用。当然我们也可以在Flask里复制出像Django那样的项目结构。

模版

Django的模版大家都很熟悉,我们举一个简单的例子

复制代码
<!-- view.html -->
<div class="top-bar row"><div class="col-md-10"><!-- more top bar things go here --></div>{% if user %}<div class="col-md-2 whoami">You are logged in as {{ user.fullname }}</div>{% endif %}
</div>
{% for widget in inventory %}<li><a href="/widget/{{ widget.slug }}/">{{ widget.displayname }}</a></li>
{% endfor %}
复制代码

 

Flask默认使用一个受Django启发而发展起来的名为Jinja2的模板,其实,所有上面的Django模板的例子在Jinja2里也是好使的。

模版简单对比

<!-- Django -->
<div class="categories">Categories: {{ post.categories|join:", " }}</div><!-- Jinja -->
<div class="categories">Categories: {{ post.categories|join(", ") }}</div>

 

在Jinja的模板语言里,可以把任何数量的参数传给过滤器,因为Jinja像调用一个Python函数的方式来看待它,用圆括号来封装参数。Django使用冒号来分隔过滤器名和参数,这样就只能传递一个参数了。

  • Flask的Jinja模版 for-else-endfor
复制代码
{% for item in inventory %}<div class="display-item">{{ item.render() }}</div>
{% else %}<div class="display-warn"><h3>No items found</h3><p>Try another search, maybe?</p></div>
{% endfor %}
复制代码

 

  • Django模版 for-empty-endfor
复制代码
{% for item in inventory %}<div class="display-item">{{ item.render }}</div>
{% empty %}<div class="display-warn"><h3>No items found</h3><p>Try another search, maybe?</p></div>
{% endfor %}
复制代码

 

除了上述的语法区别,Flask还提供了很多特有的上下文变量(url_for,get_flashed_messages()等)

----------------------------------------------------------------------------------

Flask框架主要的特点是轻巧,简介,扩展性强;核心就是 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。

Flask内置的6种转换器:

‘path’  ‘string’  ‘any’  ‘int’  ‘float’  ‘uuid’

Josn 和xml 的区别:首先他们都是用来数据交互的,其次josn 更加轻量些

 

Flask中有两种上下文,请求上下文和应用上下文。

上下文:相当于一个容器,他保存了Flask程序运行过程中的一些信息。

 

 

请求上下文(request context)

request和session都属于请求上下文对象。

request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。

(通俗来说:Request主要用来获取客户端发送过来的一些参数)

 

session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

(通俗来说:Session主要用来实现一些用户的会话信息)

 

 

应用上下文(application context)

current_app和g都属于应用上下文对象。

current_app:表示当前运行程序文件的程序实例。我们可以通过current_app.name打印出当前应用程序实例的名字。

(通俗来说:Current_app代表当前程序运行实例,只要程序没有暂停终止,他会一直存在, 可以帮助我们记录项目日志)

g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。比如:我们可以获取一些临时请求的用户信息。

(通俗来说:g对象和request和session比较像,请求过程中帮助我们创建,请求结束后销毁,是起到一个临时存储的作用)

  • 当调用app = Flask(_name_)的时候,创建了程序应用对象app;
  • request 在每次http请求发生时,WSGI server调用Flask.call();然后在Flask内部创建的request对象;
  • app的生命周期大于request和g,一个app存活期间,可能发生多次http请求,所以就会有多个request和g。
  • 最终传入视图函数,通过return、redirect或render_template生成response对象,返回给客户端。

区别: 请求上下文:保存了客户端和服务器交互的数据。 应用上下文:在flask程序运行过程中,保存的一些配置信息,比如程序文件名、数据库的连接、用户信息等。

(应用上下文生命周期比请求上下文的生命周期长)

 

 

请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request:在处理第一个请求前运行。

before_request:在每次请求前运行。

after_request:如果没有未处理的异常抛出,在每次请求后运行。

teardown_request:在每次请求后运行,即使有未处理的异常抛出。

转载于:https://www.cnblogs.com/klb561/p/11298404.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware workstation 15.5.2及镜像文件下载

链接: https://pan.baidu.com/s/175imV_FeTFcitFHay07vHQ 提取码: ayh3 希望对大家有用&#xff01; https://blog.csdn.net/hanhanwanghaha一个超级无敌可爱的人鸭 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出…

无法连接虚拟设备 floppy0,因为主机上没有相应的设备。 您要在每次开启此虚拟机时都尝试连接此虚拟设备吗?

如果出现以上情况&#xff0c;应该是没有连接镜像文件&#xff0c;在添加镜像文件的地方添加镜像文件就可以了 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&…

CentOS 6.5 下安装 Kibana5

1. 导入Elastic PGP Key 执行命令 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 2. 安装Kibana的rpm库使用 ll /etc/yum.repos.d/ 查看当前机器上已经安装的rpm库&#xff0c;如果没有Kibana的话需要创建。用vim创建新的repo文件&#xff0c;vim /etc/yu…

详述白盒测试的逻辑覆盖法的条件组合覆盖及其优缺点

概念&#xff1a; 设计足够多的测试用例&#xff0c;使被测程序中每个判定的所有可能的条件取值组合至少执行一次。 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出…

详述白盒测试的逻辑覆盖的路径覆盖及其优缺点

详述白盒测试的逻辑覆盖的路径覆盖及其优缺点定义&#xff1a;与其他覆盖的关系&#xff1a;路径覆盖率&#xff1a;测试用例&#xff1a;优缺点&#xff1a;定义&#xff1a; https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&…

Jmeter下载安装详细步骤(最新)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 官网地址 http://jmeter.apache.org/ 步骤 1.点击Downl…

怎样使用navicat将mysql的数据表导出保存(转储SQL文件)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 1.点击你所创建的表&#xff0c; 2.右键点击转储SQL文件&…

Java如何连接mysql数据库详解(代码)

工具&#xff1a; https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; eclipseMysqlMysql驱动链接&#xff1a;…

docker 笔记

---恢复内容开始--- 安装 win10专业版 开启Hyper-V 安装docker 下载地址&#xff1a;https://store.docker.com/editions/community/docker-ce-desktop-windows vs2017 直接添加 项目docker docker stop zeekodb //停止这个容器 docker start zeekodb //运行这个容器 首先你要…

Python下载、安装及其配置

python下载&#xff1a;安装&#xff1a;配置环境变量&#xff1a;下载&#xff1a; 网址&#xff1a;https://www.python.org/downloads/windows/ 点击Download Windows x86-64 executable installer,下载到你觉得合适的地方下。 https://blog.csdn.net/hanhanwanghaha宝藏…

Pycharm社区版下载及安装教程

下载&#xff1a; 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 安装&#xff1a; 打开你下载的路径&#xff0c;双击.exe文件&#xff0c;点击运行 默认点击next之后&#xff0c;选择路径&#xff0c;尽量不要选择在C盘&#xff0c;然后…

DATA SHARING Help JetBrains improve its products by sending anonymous data about features and plugin

当在使用Pycharm时&#xff0c;出现 中文翻译过来的意思是&#xff1a; 帮助JetBrains改进其产品&#xff0c;发送有关所用功能和插件、硬件和软件配置、文件类型统计信息、每个项目的文件数等的匿名数据。 请注意&#xff0c;这不包括个人数据或任何敏感信息&#xff0c;如…

怎样使用Pycharm(Python工具)新建项目及创建Python文件

创建项目 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 首先打开Pycharm 勾选I confirm that I have rea…

以Python为例对变量类型及运算符进行举例

变量的定义&#xff1a; 在 python 中,每个变量在使用前都必须赋值 eg:变量名储存在变量中的值 变量定义完成后&#xff0c;接下来就是使用变量&#xff0c;为变量赋值。 注:在Python中不需要注明变量是什么类型&#xff0c;在python运行的时候它会自动判别是什么类型&#x…

Python的if条件语句(常用)当为多个判定条件时

基本形式&#xff1a; if 判断条件&#xff1a; 执行语句 else 执行语句&#xff1a; 当判断条件为多个值时&#xff0c;采取以下形式&#xff1a; if 判断条件1&#xff1a; 执行语句1 elif判断条件2&#xff1a; 执行语句2 elif 判断条件3&#xff1a; 执行语句3 …… els…

while循环在Python中的应用举例 及其break continue的使用

while循环定义&#xff1a; https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&a…

在Python当中如何打印输出当前时间(代码)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 代码&#xff1a; import time print(time.strftime(%Y-%…

Pycharm怎么改背景颜色(超详细)

1.首先打开Pycharm&#xff0c;点击file&#xff08;文件&#xff09;&#xff0c;在点击settings(设置) 点击Editor&#xff08;编辑器&#xff09;&#xff0c;点击Color Scheme&#xff08;色彩方案&#xff09;,再点击Console Colors&#xff08;控制台颜色&#xff09; 打…

Python中字符串如何定义简单举例

详细代码&#xff1a; #codingutf-8#定义一个单行字符串用"" 或者 注:是用英文输入 String "这街上太拥挤" String1 "太多人有秘密"#定义一个多行字符串用""" """ 或者 注明&#xff1a;是用英文输入 Stri…

Python转义字符及举例(常见)代码解释

常见转移字符表 转义字符说明\ (在行尾时)续行符\ \反斜杠符号“\”\ ’单引号\ "双引号\n换行\v纵向制表符\t横向制表符\r回车\f换页 举例&#xff1a; \’-单引号 代码&#xff1a; #codingutf-8string I ll be a good person print(string)我们输入string ‘I’l…