精华内容
下载资源
问答
  • JAVA后端应该学什么技术?

    万次阅读 多人点赞 2019-07-01 16:17:34
    Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程...Servlet技术是Java后端的重要技术之一,作为Java Web开发的核心组件,Servlet承担了Web MVC结构中的核心作用(功能导航)。传统的Model2结构...

    Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中立,所以在大型互联网平台的开发中得到了广泛的采用。

    目前要想从事Java的后端开发应该学习以下内容:

    第一,Servlet技术。Servlet技术是Java后端的重要技术之一,作为Java Web开发的核心组件,Servlet承担了Web MVC结构中的核心作用(功能导航)。传统的Model2结构(Servlet+JavaBean+JSP)虽然在目前已经很少使用了,但是Web开发的基本结构依然没有改变。Servlet技术的应用涉及到Web容器、会话(HttpSession)、安全、同步、Web应用部署等相关内容。

    第二,Java操作数据库。后端开发免不了与数据库打交道,所以掌握Java的数据库操作是一个基本要求。Java操作数据库涉及到的内容有JDBCJNDIRMIDAO等内容,其中使用RMI+JDBC是构建java数据库开发的一个常见的解决方案,而JNDI则是对各种资源的定义。

    第三,Spring框架。Spring+SpringMVC+MyBatis是目前一个比较常见的后端开发方案,Spring的原理就是构建了一个业务组件容器SpringMVC则是Web MVC的一个具体实现框架,而MyBatis则是一个基于DAO的实现框架。从性能的角度来说,Spring是EJB的轻量级解决方案,得到了广大Java程序员的欢迎。如果有Servlet以及数据库操作的基础,那么学习这几个框架的使用是一件非常轻松的过程。虽然基于Spring的编程比较方便,但是Spring也有缺点,比如配置文件过于繁琐。

    第四,结合hadoop构建Java的分布式开发。Java的分布式开发是提高Java后端处理能力的重要内容,RMIJava分布式开发比较常见的解决方案,学习起来也比较简单。在学习完RMI之后可以进一步学习在Hadoop平台(大数据平台)下构建Java的分布式应用,另外Docker(云计算常用)也是一个不错的构建分布式开发的平台。

    Java开发涉及到的内容比较多,需要一个系统的学习过程,建议在实际使用过程中学习,这样效果会更好。

    本文分享到此就结束,以上就是我对Java后端需要掌握哪方面的技术的一个简单分享,希望对你们会有所帮助,如果你现在也在学习Java,在入门学习Java的过程当中有遇见任何行业,技术方面的问题,你都可以加入我的Java学习交流群:https://jq.qq.com/?_wv=1027&k=5wobSeD 里面有我从去年到现在,根据市场技术栈需求录制的最新视频教程,群文件里面还有我这几年整理的学习手册,面试题,开发工具,PDF文档教程,需要的话可以自己去下载。

    展开全文
  • 1 在pycharm中创建项目 1 点击顺序: File -> new project -> flask -> create 2 向项目中添加一个app.py文件作为整个flask app的..._name__ == '__main__': # 运行flask app app.run() 4 测试成功: 网页: 后端结果:

    1 在pycharm中创建项目

    • 1 点击顺序: File -> new project -> flask -> create
    • 2 向项目中添加一个app.py文件作为整个flask app的入口

    2 为项目的venv(虚拟环境)安装flask

    # 进入项目根目录后
    cd venv/bin
    python -m pip install flask
    python -m pip install flask_core #not necessary
    python -m pip install flask_cors
    

    如果报了pg_config not_found的错误,是一些基础软件没有安装,其安装方式如下:

    # for debian/ubuntu:
    sudo apt-get install libpq-dev python-dev
    # for archlinux/manjaro
    sudo pacman -S postgresql
    

    3 编写测试代码

    在app.py中添加如下代码:

    from flask import Flask, jsonify
    from flask_cors import CORS
    import threading
    import time
    
    
    # configurations
    DEBUG = False
    
    # instantiate the app
    app = Flask(__name__)
    app.config.from_object(__name__)
    
    # enable CORS
    CORS(app, resources={r'/*': {'origins': '*'}})
    
    # 读取的数据文件的路径
    DATA_FILE_PATH = "/home/nash5/Desktop/class/data/pitchOnly.csv"
    
    # 存放读取的数据和洗出,反解正解后的数据,这些数据供前端读取
    srcData = []
    resData = []
    sumIOData = {
        'wPitch': [],
        'wRoll': [],
        'xAcc': [],
        'yAcc': [],
        'zAcc': [],
        'h1': [],
        'h2': [],
        'h3': []
    }
    
    sumResData = {
        'xa1': [],
        'ya1': [],
        'za1': [],
        'xa2': [],
        'ya2': [],
        'za2': [],
        'xa3': [],
        'ya3': [],
        'za3': [],
        'h1': [],
        'h2': [],
        'h3': [],
        'pitch': [],
        'roll': [],
        'updown': []
    }
    
    # 用于srcData和resData的锁
    lock = threading.Lock()
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    @app.route('/io', methods=['GET'])
    def io():
        # print (sumIOData)
        return jsonify(sumIOData)
    
    
    @app.route('/visualize', methods=['GET'])
    def visualize():
        # print (sumResData)
        return jsonify(sumResData)
    
    
    
    if __name__ == '__main__':
    
        # 运行flask app
        app.run()
    

    4 测试成功:

    网页:
    浏览器结果
    后端结果:
    后端结果

    展开全文
  • WEB前端、后端的说明

    千次阅读 2018-07-29 10:12:29
     用户看不到的部分,就是后端。比如数据库、业务逻辑等。  这个说法是不是对的呢?吾上网搜索了一些说法,供大家参考: ------------------------------------------------------------------------------------...

      这个问题,吾其实认为很简单:

      用户看到的部分,就是前端。主要指页面内容。

      用户看不到的部分,就是后端。比如数据库、业务逻辑等。

      这个说法是不是对的呢?吾上网搜索了一些说法,供大家参考:

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

    • 前端:是网民在上网页时第一眼看到的页面或是分支点信息页面等。或者是页面中的图片、文字、框架分配、视频、语音等整体布局都是web的前端。

    • 后端:是网民第一眼是看不到的,一般只有部分专业人员才能大致看到。像语言编写、创建方式、改写或优化网站的方式这些操作则为web的后端。

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

    1、网站前端

    网站前端就是网站的页面设计或者是静态的网页设计,简单的说我们访问一个网站看到的所有页面网页上的内容和版式样式都属于网站前端,网站前端工作就是设计网站的静态页面,所谓的静态页面就是网站前端不包括后端,简单的例子说一下,静态页面就像一张报纸,上面有文字图片和内容,并排好版,之所以称之为静态是因为这些内容不能动态的改变,也就是所有人看到的静态页面都是一模一样的,没有任何区别,这是因为这个页面是静态的,不会改变。总之,网站前端就是指的网站的静态页面设计,网站前端工作使用的是html、css、js等技术设计网站页面的样式和排版布局,这就是网站前端。

    2、网站后端

    网站后端也叫网站后台技术或者动态网站技术,上面我们也说了静态页面的缺点就是不能动态的改变页面上的内容和实现一些代码逻辑,比如我们要实现用户的注册登录验证、或者购物结算等,这些都是要代码逻辑来实现的,还有我们需要一个后台来往我们的网页添加一些消息新闻通知等,因为不是每一个网站的使用者都懂前端技术来来改变页面内容,而且这样也太不方便了,所以需要网站后台来实现这些功能,这些东西都是需要网站后台技术来实现的。常见的网站后端开发语言有asp、asp.net、jsp、php等。同时网站后台技术还包括数据库如MySQL、sqlserver等,数据库是用来存储后台数据的。

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

    网站前端和后台的工作是完全不同的,前端的工作是设计静态页面,后台是结合数据库实现一些代码的逻辑如验证用户登录等,后台更加偏重与逻辑思维。

     

    使用html、Javascript写的是Web前端,它不用向服务器(比如apache、nginx、tomcat等)交互在浏览器端就执行完了,比如使用Javascript弹出一个警告框的效果。

    而php、Python等是后台语言,当通过浏览器向服务器发送访问php文件的请求时(比如:http://localhost:63342/php_basic/helloworld.php),由web服务器收到请求,发现是php代码则交给php解析器完成解析,然后发回给web服务器,最后返回给浏览器。 

     

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

    一个追求任何场景下都美丽动人,

    一个追求巨大压力下举重若轻。

    但两者又必须密切分工合作,才能使得项目顺利进行。分工的核心在于在哪里渲染页面。不同的渲染位置决定了不同分工模式。

    在服务器端渲染

    这个模式有一个问题——不能实现部分更新。即使用户点了一个按钮,产生了很细微的数据变动,也需要后端重新渲染整个页面再将页面发往浏览器端。如果页面存在大量的静态的部分,这种方式无疑不是高效的。

          同时,前端工程师们需要用模板定义展现形式,后端工程师们需要用模板输出数据。久而久之,模板就会越来越复杂,越来越不可维护。

     

    在浏览器端渲染

    浏览器端发送请求后从服务器端接受到了模板和 J S代码。浏览器执行接受到的 JS 代码,JS 代码会从服务器请求数据,并将数据填充到模板中。

    利用运行在浏览器端的Javascript语言,前端工程师能够从后端服务器获取数据,进而按照业务逻辑渲染页面。这时候后端工程师只需要开发稳定的 API 提供数据就可以了。这种模式虽然依然是B/S模式,但开发的场景却和C/S模式比较相近。在浏览器端渲染的好处在于前端完全控制了模板,后端只需要开发相应的 API, 分工比较明确。并且支持部分页面更新。同时同一套后端服务可以同时支持不同的展示模式,比如同一套后端服务还可以支持移动开发。

          当然啦,浏览器渲染也存在一些问题。其中最大的问题是对 SEO 不友好。搜索引擎的爬虫程序必须像浏览器一样执行 JS 代码才能获得页面的内容,从而提高了爬虫爬取页面的难度。

    大前端模式

     借助神器Node.js,前端工程师终于把磨爪伸进服务器了。Node.js是一个来自老毛子的高性能异步服务器。如果只是一个服务器,Node.js并不出奇。一般服务器需要提供一种编程语言的runtime,方便开发者进行开发。Node.js因为异步的关系选择了异步性能很好的Javascript,就是前端工程师经常在页面上写的那个Javascript。这时前端工程师们一看,呀,这玩意我会呀。因此利用Node.js,前端工程师不再局限在浏览器,可以在服务器写Javascript代码了。这时前端工程师可以按需要,选择在浏览器端或者服务器端完成渲染。这个模式我们可以称之为大前端模式。

          大前端模式下,前端工程师有更大的灵活性进行开发,从而可以避免前面两种模式的弊端,发挥他们的长处。但是,世间无十全十美之事,大前端模式也有自己的弊端。前端工程师们被赋予了服务器写代码的能力,也就需要承担服务器编程的责任。能力越大责任也就越大嘛。在服务器写代码,前端工程师必须承担日志、安全和负载均衡等后端工程师才需要承担的责任。大前端攻城狮相当于把前端攻城狮和后端攻城狮两种物种的基因杂揉在一起创造出来的混元体,其稀有程度可想而知。这也就是现在精通Node.js程序员少的原因。

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

    Tomcat是Application Server,Apache和Nginx则是Web Server,这两者有区别。

    Web Server一般是完整实现了HTTP协议的服务器,负责接收用户的HTTP请求,然后响应请求,至于这么处理这个请求,就要交给Application Server去处理了,Application Server里面跑着像PHP,Python的脚本。Web Server和Application Server之间需要通过协议沟通,比如CGI、WSGI这类东西。虽然一些Application Server也能充当Web Server,但是它们对HTTP协议的实现并不完整,因此生产环境下不会这么用。

    像node这种本身自带Web Server的,就不需要额外弄一个Web Server了。SSR的情况下,直接服务端渲染返回,这个理解起来应该不难。如果非SSR,后端返回一个页面,前端要加去载。至于前端资源要放哪,可以有很多选择,直接放在项目静态资源目录下,或者上传到CDN,或者在nginx下开一个静态目录存放都可以。

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

    前端技术

    • nodejs.
    • webpack.

    后端技术

    • mysql.
    • springMVC.

    1、前端请求数据URL由谁来写

    在开发中,URL主要是由后台来写好给前端。 
    若后台在查询数据,需要借助查询条件才能查询到前端需要的数据时,这时后台会要求前端提供相关的查询参数(即URL请求的参数)。

    2、接口文档主要由谁来写

    接口文档主要由后台设计和修改。 
    后台直接跟数据打交道,最清楚数据库里有什么数据,能返回什么数据。 
    前端只是数据的被动接受者,只是接口文档的使用者。 
    使用过程中,发现返回的数据部队,则跟后台商量,由后台修改。 
    切记:前端不能随意更改接口文档,除非取得后台同意。

    3、前端与后台交互的数据格式

    主要是JSON,XML现在用的不多

     

    JSON 通常用于与服务端交换数据。

    在接收服务器数据时一般是字符串。

    我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

    4、前端与后台的交互原理

    关注点:接口地址、前端请求的参数、后端返回的参数。 
    调一下接口,看一下返回的数据。

    5、前端请求参数的形式

    GET和POST两种方式 
    GET从指定的服务器中获取数据,POST提交数据给指定的服务器处理

    6、前端应该告知后台那些有效信息,后台才能返回前端想要的数据

    先将要展示的页面内容进行模块划分,将模块的内容提取出来,以及方便前端的一些标志值等,将所有想要的内容和逻辑告知后端 
    后端从数据库里面去查询相应的数据表以获得相应的内容或者图片地址信息 
    URL中的参数主要是根据后台需要,若后台需要一个参数作为查询的辅助条件,前端在URL数据请求时就传递参数

    7、前端如何把页面信息有效传达给后台,以及后台如何获取到这些数据

    所有前端请求的URL后面的参数都是辅助后台数据查询的 
    若不需要参数,那后台就会直接给个URL给前端

    8、前端应该如何回拒一些本不属于自己做的一些功能需求或任务

    前端负责把数据展示在页面上 
    清晰的认识自己需要做的需求和任务

    9、当前端在调用数据接口时,发现有些数据不是我们想要的,那么前端应该怎么办

    把请求的URL和返回的数据以及在页面的展示的情况给后台看【后台查询数据、取数据、封装数据方面等蛮难处理的】

    10、为什么需要在请求的时候传入参数

    后台在查询数据库的时候需要条件查询

    展开全文
  • 后端框架之Flask--初识

    千次阅读 2018-07-05 20:15:10
    # 第三步 装饰器的作用是将路由映射到视图函数 demo ,并返回 helloworld @app.route('/') def demo(): return "helloworld!!" # 第四步 Flask应用程序实例的 run 方法 启动 WEB 服务器 if __name__ == '__main__':...

    1、Web框架

    web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛。这对程序员的要求会越来越高。如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人员可以把精力放在具体的业务逻辑上面。使用框架的优点:

    • 稳定性和可扩展性强
    • 可以降低开发难度,提高开发效率。

    在 Python 中常用的 Web 框架有:

        Flask 、Django、Tornado


    2、Flask简介

    Flask 是一个 Python 实现的 Web 开发微框架。你正在阅读的是开发版本的文档。

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

    英文文档(http://flask.pocoo.org/docs/0.11/

    Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集。此文档不包含这两个库的文档。要细读它们的文档,请点击下面的链接:

    Jinja2模板引擎 

    Werkzeug WSGI工具集

    3、HelloWorld示例-基础

    # 第一步   导入Flask类
    from flask import Flask
    # 第二步    Flask函数接收一个参数__name__,它会指向程序所在的包
    app = Flask(__name__)
    
    # 第三步   装饰器的作用是将路由映射到视图函数 demo ,并返回 helloworld
    @app.route('/')
    def demo():
        return "helloworld!!"
    
    # 第四步   Flask应用程序实例的 run 方法 启动 WEB 服务器
    if __name__ == '__main__':
        app.run()
    


    4、相关配置参数

        4、1    初始化参数
    Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:


    app = Flask(__name__,  # Flask程序所在的包(模块),传 __name__ 就可以 ;其可以决定 Flask 在访问静态文件时查找的路径
                static_path='static',  # 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
                static_url_path='static',  # 静态文件访问路径,可以不传,默认为:/ + static_folder
                static_folder='static',  # 静态文件存储的文件夹,可以不传,默认为 static
                template_folder='templates'  # 模板文件存储的文件夹,可以不传,默认为 templates
                )

    4、2    程序加载配置

    在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:
    # 第一种   从对象中加载配置
    class Config(object):
        DEBUG = True
    
    app.config.from_object(Config)
    
    # 第二种   从文件中加载配置
    app.config.from_pyfile('config.ini')
    
    # 第二种   从环境变量中加载配置
    app.config.from_envvar('ENVCONFIG')
    

    4、3    app.run的参数

    可以指定运行的主机IP地址,端口,是否开启调试模式

    app.run(host="0.0.0.0", port=5000, debug = True)


    5、Flask中的路由

    5.1    指定路由地址:

    # 指定访问路径为 demo1
    @app.route('/demo1')
    def demo1():
        return 'demo1'

    5.2    给路由传参示例:有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。

    # 路由传递参数
    @app.route('/user/<user_id>')
    def user_info(user_id):
        return 'hello %s' % user_id

    由传递的参数默认当做 string 处理,也可以指定参数的类型

    # 路由传递参数
    @app.route('/user/<int:user_id>')
    def user_info(user_id):
        return 'hello %d' % user_id
    这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数


    5.3    指定请求方式:

    @app.route('/demo2', methods=['GET', 'POST'])
    def demo2():
        # 直接从请求中取到请求方式并返回
        return request.method

    6、视图常用逻辑

    6、1    返回JSON

    在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应

    # 返回JSON
    @app.route('/demo4')
    def demo4():
        json_dict = {
            "user_id": 10,
            "user_name": "laowang"
        }
        return jsonify(json_dict)
    注:不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json
          

    6、2    重定向

    重定向到百度网址

    # 重定向
    @app.route('/demo5')
    def demo5():
        return redirect('http://www.baidu.com')

    重定向也可以使用url_for生成指定视图函数所对应的url

    @app.route('/demo1')
    def demo1():
        return 'demo1'
    
    # 重定向
    @app.route('/demo5')
    def demo5():
        return redirect(url_for('demo1'))

    重定向可以到带参数的视图函数, 在url_for 函数中传入参数

    # 路由传递参数
    @app.route('/user/<int:user_id>')
    def user_info(user_id):
        return 'hello %d' % user_id
    
    # 重定向
    @app.route('/demo5')
    def demo5():
        # 使用 url_for 生成指定视图函数所对应的 url
        return redirect(url_for('user_info', user_id=100))

    6.3 自定义状态码

     Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666

    @app.route('/demo6')
    def demo6():
        return '状态码为 666', 666

    7、正则匹配路由

    在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

    具体实现步骤为:

    • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
    • 自定义转换器:自定义类继承于转换器基类
    • 添加转换器到默认的转换器字典中
    • 使用自定义转换器实现自定义匹配规则

    1、代码实现

    from flask import Flask
    # 第一步:导入转换器基类
    from werkzeug.routing import BaseConverter
    
    
    # 第二步:自定义转换器类
    class RegexConverter(BaseConverter):
        def __init__(self, url_map, *args):
            super(RegexConverter, self).__init__(url_map)
            # 将接收到的第一个参数当做匹配规则进行保存
            self.regex = args[0]
    
    
    app = Flask(__name__)
    # 第三步: 将自定义转化器添加到转化器字典中去, 并指定转化器使用时的名字为:re
    app.url_map.converters['re'] = RegexConverter
    
    
    # 第四步: 使用转化器实现自定义匹配规则, 此处定义的是6位整数
    @app.route('/user/<re("[0-9]{6}:user_id")>')
    def user_info(user_id):
        return "user_id 为 %s" % user_id
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    7、2    自定义转换器其他两个函数实现--to_python 和 to_url

    to_python:

    • 该函数参数中的 value 值代表匹配到的值,可输出进行查看
    • 匹配完成之后,对匹配到的参数作最后一步处理再返回,比如:转成 int 类型的值再返回:

    to_url:

    • 在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的视图函数参数做进一步处理
    • 具体可参见 Flask 的 app.py 中写的示例代码:ListConverter

    from flask import Flask
    from flask import redirect
    from flask import url_for
    from werkzeug.routing import BaseConverter
    
    class ListConverter(BaseConverter):
        regex = "(\\d+,?)+\\d$" #匹配多个数字字符串
    
        def to_python(self, value):
            #对匹配到的参数做进一步处理再返回(访问数据的时候)
            return value.split(',')  #字符串->列表
    
        def to_url(self, value):
            #对视图函数参数做进一步处理(返回数据的时候)
            #针对url_for()中的参数做处理
            result = ','.join(str(v) for v in value) # 列表->字符串
            return result
    app = Flask(__name__)
    app.url_map.converters["list"] = ListConverter
    
    @app.route('/')
    def index():
        return 'index'
    
    #规定访问的参数必须是列表
    @app.route('/users/<list:user_ids>')
    def demo2(user_ids):
        #print(type(user_ids)) #列表
        return "用户的id列表是 %s" % user_ids #当做字符串返回
    
    @app.route('/demo3')
    def demo3():
        #url_for 通过函数匹配路由,在匹配的时候可以调用to_url
        return redirect(url_for('demo2', user_ids=[1, 3, 4, 5]))
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    7、3    系统自带的转化器

    DEFAULT_CONVERTERS = {
        'default':          UnicodeConverter,
        'string':           UnicodeConverter,
        'any':              AnyConverter,
        'path':             PathConverter,
        'int':              IntegerConverter,
        'float':            FloatConverter,
        'uuid':             UUIDConverter,
    }
    系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。


    8、异常捕获

    8、1    HTTP 异常主动抛出

    abort 方法:抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。只能抛出 HTTP 协议的错误状态码

    # abort(404)
    abort(500)

    8、2    捕获错误

    errorhandler 装饰器:注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法,参数为HTTP的错误状态码或指定异常;

    @app.errorhandler(500)
    def internal_server_error(e):
        return '服务器搬家了'

    捕获制定异常:

    @app.errorhandler(ZeroDivisionError)
    def zero_division_error(e):
        return '除数不能为0'

    9、请求勾子

    在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

    • 在请求开始时,建立数据库连接;
    • 在请求开始时,根据需求进行权限校验;
    • 在请求结束时,指定数据的交互格式;

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

    • before_first_request
      • 在处理第一个请求前执行
    • before_request
      • 在每次请求前执行
      • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
    • after_request
      • 如果没有抛出错误,在每次请求后执行
      • 接受一个参数:视图函数作出的响应
      • 在此函数中可以对响应值在返回之前做最后一步修改处理
      • 需要将参数中的响应在此参数中进行返回
    • teardown_request:
      • 在每次请求后执行
      • 接受一个参数:错误信息,如果有相关错误抛出


    10、装饰器路由具体实现梳理

    Flask有两大核心:Werkzeug和Jinja2:

    - Werkzeug实现路由、调试和Web服务器网关接口
    - Jinja2实现了模板。
    Werkzeug库的 routing 模块负责实现 URL 解析。不同的 URL 对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,执行该函数以此生成一个响应信息。

    routing模块内部有:

    • Rule类
      • 用来构造不同的URL模式的对象,路由URL规则
    • Map类
      • 存储所有的URL规则和一些配置参数
    • BaseConverter的子类
      • 负责定义匹配规则
    • MapAdapter类
      • 负责协调Rule做具体的匹配的工作

    11、request

    request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)

    常用的属性如下:

    属性说明类型
    data记录请求的数据,并转换为字符串*
    form记录请求中的表单数据MultiDict
    args记录请求中的查询参数MultiDict
    cookies记录请求中的cookie信息Dict
    headers记录请求中的报文头EnvironHeaders
    method记录请求使用的HTTP方法GET/POST
    url记录请求的URL地址string
    files记录请求上传的文件*


    12、状态保持

     http 是一种无状态协议,浏览器请求服务器是无状态的

    无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

    无状态原因浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。

    但是实际情况需要保持用户浏览的状态,通常有两种方式:

    • 在客户端存储信息使用Cookie
    • 在服务器端存储信息使用Session

    12、1     Cookie

    Cookie:  指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密);Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie);Cookie的key/value可以由服务器端自己定义。

    • 应用
      • 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
      • 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
      • 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
    • 提示

      • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
      • Cookie基于域名安全,不同域名的Cookie是不能互相访问的
        • 如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息
        • 浏览器的同源策略
      • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

    • Cookie的增删改查代码:
    from flask import Flask, make_response, request
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        # 查询cookie
        user_id = request.cookies.get('user_id')
        user_name = request.cookies.get('user_name')
        return '%s----%s' % (user_id, user_name)
    
    
    @app.route('/login')
    def login():
        response = make_response('success')
        # 设置cookie
        response.set_cookie('user_id', '1')
        response.set_cookie('user_name', 'laowang')
        print("login"+str(response))
        return response
    
    @app.route('/logout')
    def logout():
        response = make_response('success')
        # 删除cookie
        response.delete_cookie('user_id')
        response.delete_cookie('user_name')
        print("logout" + str(response))
        return response
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    • 设置过期时间
    @app.route('/cookie')
    def set_cookie():
        response = make_response('hello world')
        response.set_cookie('username', 'itheima', max_age=3600)
        return response

    12、2    Session

    • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
    • 在服务器端进行状态保持的方案就是Session
    • Session依赖于Cookie
    • 增删改查代码:
    from flask import Flask, session
    
    app = Flask(__name__)
    # 使用session 需要设置SECRET_KEY
    app.config['SECRET_KEY'] = 'dnuqi12kqiejadklalw'
    
    
    @app.route('/')
    def index():
        # 查询session
        user_id = session.get('user_id', "")
        user_name = session.get('user_name', "")
        return '%s====%s' % (user_id, user_name)
    
    
    @app.route('/login')
    def login():
        # 加载校验成功  设置session
        session['user_id'] = '1'
        session['user_name'] = 'laowang'
        return 'login success!'
    
    
    @app.route('/logout')
    def logout():
        # 删除session
        session.pop('user_id', None)
        session.pop('user_name', None)
        return 'logout ok!'
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    13、上下文

    Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)

    13、1    请求上下文(request context)

    在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session

    • request
      • 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
    • session
      • 用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

    13、2    应用上下文(application context)

    它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

    应用上下文对象有:current_app,g

    current_app

    应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

    • 应用的启动脚本是哪个文件,启动时指定了哪些参数
    • 加载了哪些配置文件,导入了哪些配置
    • 连了哪个数据库
    • 有哪些public的工具类、常量
    • 应用跑再哪个机器上,IP多少,内存多大

    g变量

    g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

    g.name='abc'
    

    注意:不同的请求,会有不同的全局变量


    13、3    两者区别:

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

    上下文中的对象只能在指定上下文中使用,超出范围不能使用 请求上下文和应用上下文原理实现:https://segmentfault.com/a/1190000004223296




    ===未完结!!待续!!!===



    展开全文
  • 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)..."端"概念的提出对于编译技术的发展起到了至关重要的作用,它使编译器的框架更明晰,更利于集成与构造。 转载于:https://ww...
  • 你是否还在为才华无处施展而苦恼?你是否还在为观点不被...正方辩友团观点:后端饱和,前端发展空间大反方辩友团观点:前端没前途,后端才是王道方式:加Q群312724475参与辩论。采用自由辩论方式。辩方台词参考:...
  • 5.两分钟让你明白app后端有啥用

    万次阅读 2015-02-11 18:11:05
    两分钟让你明白app后端有啥用
  • 基于SSM的小程序中后端各结构层作用及关系 1.持久层:mapper层(属于mybatis模块) mapper层:主要负责与数据库进行交互设计,用来处理数据的持久化工作。 mapper层的设计首先是设计mapper的接口,也就是项目中你...
  • SLAM后端概述

    2021-01-19 15:25:50
    后端概述状态估计的概率解释后端的概念后端要解决的问题问题的简单描述问题的数学表述 状态估计的概率解释 后端的概念   前端视觉里程计只能通过邻近的几张图片估计短暂时间内的运动轨迹和路标,这种方式为“渐进...
  • Flink状态后端

    2021-01-06 09:24:49
    什么是状态后端? 每传入一条数据,有状态的算子任务都会读取和更新状态 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问 状态的存储、访问以及维护...
  • 数字IC前端后端的区别,数字IC设计流程与设计工具

    万次阅读 多人点赞 2018-11-27 19:57:23
    由于时钟信号在数字芯片的全局指挥作用,它的分布应该是对称式的连到各个寄存器单元,从而使时钟从同一个时钟源到达各个寄存器时,时钟延迟差异最小。这也是为什么时钟信号需要单独布线的原因。 CTS工具,...
  • SLAM后端

    2019-08-14 14:33:24
    粒子滤波器一般用在激光SLAM,不用在视觉。 利用概率论推导比较简单,见视觉十四讲SLAM(P243) 假如用EKF存储路标,
  • 新手程序员通常会走入一个误区,就是认为...大家都知道 Java 是一门后端语言,后端指的就是服务端,服务端代码一般运行在服务器上,通常我们运行Java 程序的服务器都是 Linux 服务器。 这些服务器在互联网公司中一...
  • 后端-框架-Spring-bean的作用域 scope Value singleton 单例模式 prototype 每次创建新实例 request Web环境,每次HTTP请求创建新实例 session Web环境,同一会话下单例模式 ...
  • 重点阐述后端移植所必须的文件,并详细说明这些文件的作用,给出了RTL中间语言的语法结构以及 典型指令的RTL指令模板结构。最后通过一个实例对移植到新硬件体系结构的GCC进行测试,结果表明针对特定的硬件 体系结构...
  • 使用Verilog代码实现LCD1602液晶显示屏驱动模块,然后在Linux下,使用dc工具将设计文件生成门级网表,通过icc工具进行后端的布局布线、时钟树综合、修改时序违例,内容详实,对涉及的命令作用进行了详细描述。
  • 前端ajax与后端Spring MVC控制器有以下五种数据交互方式。(前台使用了dhtmlxGrid,后端使用了fastjson) 方式一 通过URL传参 通过URL挂接参数,如/auth/getUser?userid=’6′ 服务器端方法可编写为:getUser(String ...
  • 现在项目开发都是前后端分离,该代码主要是教初学者使用springboot开发接口,其中包括数据返回的包装类,自定义异常,返回码的枚举等,并进行简单的测试,达到抛砖引玉的作用,初学者能更容易地接受,共同进步.
  • 前端工程师和后端工程师对于互联网应用开发来说,前端开发和后端开发是工程师的两大工作领域,这点已经是很多同学的常识。于是,经常有人会问,前端工程师和后端工程师都是做什么的?薪资如何?未来的行业发展前景...
  • 数字后端基本认识

    千次阅读 2021-05-17 12:50:40
    1、数字后端的目的 传统上将布局布线前的工作称之为数字前端(Front End)设计,而将布局布线之后的工作称为数字后端(Back End)设计。布局的目的在于产生制作掩膜所需的GDSII文件。同时也产生布局后的网表文件...
  • 后端 中间件

    2019-06-11 15:02:47
    在匹配路由之前 def process_request(self, request): 它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象, ...
  • 后端API接口

    千次阅读 2020-11-03 10:56:39
    后端API接口 前言 在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经...
  • 常用后端代码结构

    2021-04-05 15:02:05
    常用后端代码结构: Controller+Service+Dao三层这三层的功能划分Controller层(流程控制层)主要负责具体的业务模块流程的控制Service层(业务逻辑层)主要负责业务模块的逻辑应用设计DAO层(数据操作层)主要负责与...
  • ALF(Advanved library format): 先进库格式,是一种用于描述基本库单元的格式。...做一次综合,然后让后端布一个初步的物理信息,然后再做综合,吐出的.ddc文件,里面的时序信息更准确,而且和后端的一致性更好。 ..
  • 互联网大厂的后端技术栈

    千次阅读 2020-02-22 10:28:04
    最近公司招聘海外后端研发,所以整理一份技术栈的资料给他们,但是想来这份整理也适用于所有后端研发,所以去掉了敏感内容,把它呈现于此,本文重在概述,毕竟篇幅有限,欢迎【关注】...后续可能把单点拓展成文,详细地...
  • 后端接口时间戳或者随机数的作用

    千次阅读 2019-04-18 11:23:00
    URL 的末尾追加了时间。这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发;此 URL 会由于时间戳的不同而稍微有些不同。这种技巧常被用于确保到脚本的 POST 每次都会实际生成...
  • 后端框架

    2020-06-09 11:18:54
    java后端开发(三):开发框架解读 结构解读得非常清晰! 前言 本篇讲述后端开发中用到的主要框架,旨在了解框架的意义和种类 什么是框架 我相信对于大部分开发人员来说,框架再熟悉不过了,但是要给未接触过的人...
  • 后端需要学习什么?

    千次阅读 多人点赞 2020-12-14 14:37:00
    后端需要学习什么? 后端程序员应该需要掌握编程语言、操作系统、数据库、服务器基础、计算机网络协议、数据结构 和算法、开发工具等相关的知识。 开篇声明:本文为尽可能追求专业、公证、准确、全面,以下内容部分...
  • 后端开发入门

    千次阅读 2019-03-27 21:57:05
    因为课程需要我们做一个项目,没有要求是什么程序,我们小组暂定商议为一个安卓程序,又鉴于我没有学过安卓开发,又感受到后台开发的内容自己基本没有接触到过,所以自告奋勇来写后端的内容,这个教程主要参考了b站...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,302
精华内容 74,120
关键字:

后端的作用