作者: k, k

  • python tkinter中的Frame组件如何使用

    在Python的Tkinter库中,Frame是一个用于组织其他控件的容器。它通常用于为其他控件提供结构和布局。

    以下是如何在Python的Tkinter中使用Frame的基本示例:

    import tkinter as tk  
      
    root = tk.Tk()  
      
    # 创建一个Frame  
    frame = tk.Frame(root)  
    frame.pack()  
      
    # 在Frame中添加一个Label  
    label = tk.Label(frame, text="Hello, World!")  
    label.pack()  
      
    root.mainloop()

    在这个例子中,我们首先导入tkinter库,然后创建一个Tk对象,它是一个包含其他所有控件的根窗口。然后我们创建一个Frame对象,并将其打包到根窗口中。然后我们在Frame中创建一个Label对象,并将其打包到Frame中。最后,我们通过调用mainloop方法启动Tkinter事件循环。

    注意,你可以将任何其他的Tkinter控件放在Frame中,不仅仅是Label。你可以根据需要自由组合和布局这些控件。

  • python sqlite中where子句模糊查询

    在 Python 中使用 SQLite 进行模糊查询时,可以使用 LIKE 操作符和 % 通配符来实现。不过,SQLite 不支持使用 ? 号作为占位符来进行模糊查询,因此需要在查询语句中手动添加 % 通配符。

    以下是一个示例代码,演示了如何在 Python 中使用 SQLite 进行模糊查询:

    import sqlite3  
      
    # 连接 SQLite 数据库  
    conn = sqlite3.connect('example.db')  
      
    # 获取游标  
    c = conn.cursor()  
      
    # 定义要查询的字符串  
    search_string = 'foo'  
      
    # 构建查询语句,使用 % 通配符进行模糊匹配  
    query = "SELECT * FROM my_table WHERE my_column LIKE '%{}%'".format(search_string)  
      
    # 执行查询语句  
    c.execute(query)  
      
    # 输出查询结果  
    for row in c:  
        print(row)  
      
    # 关闭游标和数据库连接  
    c.close()  
    conn.close()

    在上面的代码中,我们首先使用 LIKE 操作符和 % 通配符构建了一个模糊查询语句,然后使用 format() 方法将要查询的字符串填充到查询语句中。接着,我们使用游标执行查询语句,并遍历结果集输出查询结果。最后,我们关闭游标和数据库连接。

  • python tkinter如何销毁组件

    在Python的Tkinter库中,清除当前组件(如画布或窗口)内的画面,通常可以通过使用delete方法来实现。具体做法取决于你要清除的组件类型。

    以下是一些示例:

    1. 清除画布(Canvas)上的所有内容:
    canvas = tkinter.Canvas(root, width=500, height=500)  
    # 添加一些内容...  
    canvas.delete("all")  # 删除所有内容
    1. 清除窗口(Window)上的所有内容:

    如果你想要清除一个窗口上的所有内容,包括其子组件,你可以使用destroy方法。但是要注意,这将销毁窗口以及它的所有子组件。

    root = tkinter.Tk()  
    # 添加一些内容...  
    root.destroy()  # 销毁窗口及其所有子组件

    如果你只想清除窗口上的某些特定组件,你可以分别对这些组件调用destroy方法。

    button = tkinter.Button(root, text="Button")  
    button.pack()  
    # 其他代码...  
    button.destroy()  # 只销毁按钮

    请注意,在调用destroy方法后,你应该重新创建并添加新的组件。

    以上都是清除Tkinter组件画面的常见方式。你需要根据你的具体情况来选择最合适的方法。

  • python tkinter如何确定组件存在?

    在Python的Tkinter库中,你可以使用winfo_exists()方法来检查一个组件(如一个窗口、按钮或其他任何组件)是否存在。

    以下是一个简单的例子:

    import tkinter as tk  
      
    root = tk.Tk()  
    button = tk.Button(root, text="Click me")  
    button.pack()  
      
    # 检查按钮是否存在  
    if button.winfo_exists():  
        print("Button exists")  
    else:  
        print("Button does not exist")  
      
    root.mainloop()

    在这个例子中,winfo_exists()将返回True,因为按钮已经被创建并添加到窗口中。如果你试图在一个还没有创建的组件上调用winfo_exists(),那么它将返回False。

    这个方法对于检查组件是否已经被正确地创建和添加到窗口中非常有用,尤其是在处理复杂的GUI布局时,你可能需要确保所有的组件都已经被正确地添加到了窗口中。

  • python tkinter 导入菜单模块

    在 Python 中,使用 Tkinter 库创建 GUI 应用程序时,可以使用 Menu 类来创建菜单。Menu 类提供了一些方法和属性,可以用于创建菜单和菜单项,并将它们添加到应用程序中。

    以下是一个简单的示例,演示如何在 Tkinter 应用程序中创建菜单:

    import tkinter as tk  
      
    def do_something():  
        print("Menu item clicked!")  
      
    # 创建主窗口  
    root = tk.Tk()  
      
    # 创建菜单  
    menu = tk.Menu(root)  
    root.config(menu=menu)  
      
    # 创建菜单项  
    file_menu = tk.Menu(menu)  
    menu.add_cascade(label="File", menu=file_menu)  
    file_menu.add_command(label="Open", command=do_something)  
    file_menu.add_command(label="Save", command=do_something)  
    file_menu.add_separator()  
    file_menu.add_command(label="Exit", command=root.quit)  
      
    # 创建另一个菜单项  
    edit_menu = tk.Menu(menu)  
    menu.add_cascade(label="Edit", menu=edit_menu)  
    edit_menu.add_command(label="Cut", command=do_something)  
    edit_menu.add_command(label="Copy", command=do_something)  
    edit_menu.add_command(label="Paste", command=do_something)  
      
    # 运行应用程序  
    root.mainloop()

    在这个示例中,我们首先创建了一个主窗口 root。然后,我们创建了一个 Menu 对象,并将其添加到主窗口中。接下来,我们创建了两个子菜单 file_menu 和 edit_menu,并将它们添加到主菜单中。最后,我们将一些菜单项添加到子菜单中,并将它们与一些回调函数关联起来。在运行应用程序时,用户可以单击菜单项来触发相应的回调函数。

  • godot学习

    使用不同版本的godot如何避免版本冲突

    (https://github.com/zfoo-project/godot-start/blob/main/blog/3.%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%AC%E7%9A%84godot%EF%BC%8C3.5%E5%92%8C4.0%E4%BD%BF%E7%94%A8sc%E5%B0%B1%E8%83%BD%E5%A4%9F%E5%85%BC%E5%AE%B9%E4%BA%86.md)

    官方教程:https://docs.godotengine.org/en/latest/tutorials/io/data_paths.html#self-contained-mode

  • IFAction导出的游戏如何在linux程序下运行?

    linux下自带python环境,使用IFAction导出web端

    以下内容放在ifaction导出的web文件夹下,linux下直接在此文件夹下打开终端,使用命令:

    python play.py

     

     

    然后在出现的界面中,点击【启动】即可运行游戏,

    关闭游戏-点击【结束】,然后把所有终端全部关闭。

    windows下需要安装python才能够运行游戏,当然你可以直接使用导出的exe游戏程序。

    import tkinter as tk
    from threading import Thread
    import webbrowser
    from http.server import HTTPServer, SimpleHTTPRequestHandler
    
    httpd = HTTPServer(('localhost', 8080), SimpleHTTPRequestHandler)
    
    def start_server():
        httpd.serve_forever()
    
    def on_start():
        global t
        t = Thread(target=start_server)
        t.start()
        webbrowser.open('http://localhost:8080/main.html')
    
    def on_stop():
        global t
        httpd.shutdown()
        root.destroy()
    
    root = tk.Tk()
    root.title("HTTP Server")
    root.geometry("200x100")
    
    frame = tk.Frame(root)
    frame.pack(expand=True)
    
    start_button = tk.Button(frame, text="启动", command=on_start)
    start_button.pack(expand=True)
    
    stop_button = tk.Button(frame, text="结束", command=on_stop)
    stop_button.pack(expand=True)
    
    root.mainloop()
    

     

  • flask引入bootstrap

    <!-- ------------------------------- -->
    <!-- 网络引入 -->
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
    <!-- ------------------------------- -->
    <!-- flask本地引入bootstrap -->
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename = 'bootstrap-3.4.1-dist/css/bootstrap.min.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename = 'bootstrap-3.4.1-dist/css/bootstrap-theme.min.css') }}">
    <script type="text/javascript" src="{{ url_for('static', filename = 'bootstrap-3.4.1-dist/js/bootstrap.min.js') }}"></script>
    <!-- ------------------------------- -->
    <!-- 纯本地引入 -->
    <link rel="stylesheet" type="text/css" href="static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css">
    <script type="text/javascript" src="static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
    <!-- ------------------------------- -->

    以上任选其一即可。

    我的文件目录结构是这样的:

  • 使用docker安装halo博客

    halo官网:

    https://halo.run/

    halo官方文档:

    https://docs.halo.run/

    halo官方主题仓库:

    https://halo.run/themes

    halo官方论坛:

    https://bbs.halo.run/

    正文

    1.创建容器

     docker run \
       -it -d \
       --name halo \
       -p 8090:8090 \
       -v ~/.halo2:/root/.halo2 \
       halohub/halo:2.3.0 \
       --halo.external-url=http://localhost:8090/ \
       --halo.security.initializer.superadminusername=admin \
       --halo.security.initializer.superadminpassword=P@88w0rd

    注意:此命令默认使用自带的 H2 Database 数据库。如需使用 PostgreSQL,请参考:使用 Docker Compose 部署

    • -it:开启输入功能并连接伪终端
    • -d:后台运行容器
    • –name:为容器指定一个名称
    • -p:端口映射,格式为 主机(宿主)端口:容器端口 ,可在 application.yaml 配置。
    • -v:工作目录映射。形式为:-v 宿主机路径:/root/.halo2,后者不能修改。

    补充一点:使用上面的命令之前需要把第7行的http://localhost:8090/修改为你机器的ip地址。如果像修改密码的话,建议直接把密码也改掉,至于管理员用户名想改就改,不想改就算了。

    变量详解:

    参数名 描述
    spring.r2dbc.url 数据库连接地址,详细可查阅下方的 数据库配置
    spring.r2dbc.username 数据库用户名
    spring.r2dbc.password 数据库密码
    spring.sql.init.platform 数据库平台名称,支持 postgresqlmysqlh2,需要与 SPRING_R2DBC_URL 对应
    halo.external-url 外部访问链接,如果需要再公网访问,需要配置为实际访问地址
    halo.security.initializer.superadminusername 初始超级管理员用户名
    halo.security.initializer.superadminpassword 初始超级管理员密码

    数据库配置:

    链接方式 链接地址格式 SPRING_SQL_INIT_PLATFORM
    PostgreSQL r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE} postgresql
    MySQL r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE} mysql
    H2 Database r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE h2

    2.用浏览器访问 $HALO_EXTERNAL_URL/console/(外部访问链接)即可进入 Halo 管理端。管理员用户名为 admin,登录密码为上方设置的 HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD

    如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过 http://ip:端口号 的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。

    升级版本

    1. 拉取新版本镜像
       docker pull halohub/halo:2.3.0
    2. 停止运行中的容器
       docker stop halo
       docker rm halo
    3. 备份数据(重要)
       cp -r ~/.halo2 ~/halo2.archive

      需要注意的是,halo2.archive 文件名不一定要根据此文档命名,这里仅仅是个示例。

    4. 更新 Halo

      修改版本号后,按照最初安装的方式,重新创建容器即可。

       docker run \
         -it -d \
         --name halo \
         -p 8090:8090 \
         -v ~/.halo2:/root/.halo2 \
         halohub/halo:2.3.0 \
         --halo.external-url=http://localhost:8090/ \
         --halo.security.initializer.superadminusername=admin \
         --halo.security.initializer.superadminpassword=P@88w0rd  
  • axios

    axios

    Axios 是什么

    Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js

    Axios 使用简单,包尺寸小且提供了易于扩展的接口。

    https://www.axios-http.cn/

    后端api需要自行下载程序,运行,我使用的flask写的api接口。

    https://www.123pan.com/s/ESeA-kufeh.html

     

    使用axios直接使用url发送请求

    后端需配置可跨域,前端无需设置跨域

    使用axios发送无参数get请求

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios({
         url: "http://127.0.0.1:5000/keynav/on_categorys/19",
         method: "get",
     }).then(res => {
         console.log(res);
     })
     export default {}
     </script>

    上面的代码,完成之后,打开f12,然后查看控制台即可看到结果

    使用axios发送有参数get请求

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios({
         url: "http://127.0.0.1:5000/keynav/on_categorys",
         method: "get",
         params: {
             id: "1"
         }
     }).then(res => {
         console.log(res);
     })
     export default {}
     </script>

    使用axios发送无参数post请求

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios({
         url: "http://127.0.0.1:5000/keynav/on_categorys/19",
         method: "post",
     }).then(res => {
         console.log(res);
     })
     export default {}
     </script>

    使用axios发送有参数post请求

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios({
         url: "http://127.0.0.1:5000/keynav/on_categorys",
         method: "post",
         params: {
             id: "1"
         }
     }).then(res => {
         console.log(res);
     })
     export default {}
     </script>

    使用axios处理并发请求

    并发请求(返回结果是数组)

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios.all([
         axios.get("http://127.0.0.1:5000/keynav/category"),
         axios.get("http://127.0.0.1:5000/keynav/on_categorys", { params: { id: 19 } }),
     ]).then(res => {
         console.log(res);
     }).catch(err => {
         console.log(err);
     })
     export default {}
     </script>

    使用spread方法处理响应数组结果(把数组的每一个元素变成一个对象)

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios.all([
         axios.get("http://127.0.0.1:5000/keynav/category"),
         axios.get("http://127.0.0.1:5000/keynav/on_categorys", { params: { id: 19 } }),
     ]).then(
         axios.spread((res1, res2) => {
             console.log(res1);
             console.log(res2);
         })
     ).catch(err => {
         console.log(err);
     })
     export default {}
     </script>

    全局配置

     <template>
         <div>
             111
         </div>
     </template>
     <script>
     import axios from 'axios'
     axios.defaults.baseURL = 'http://127.0.0.1:5000/keynav'
     axios.defaults.timeout = 5000;
     axios.get("/on_categorys", { params: { id: 19 } }).then(res => {
         console.log(res);
     });
     axios.post("/category").then(res => {
         console.log(res);
     }).catch(err => {
         console.log(err);
     });
     export default {}
     </script>

    请求配置

    这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 GET 方法。

     {
       // `url` 是用于请求的服务器 URL
       url: '/user',
     
       // `method` 是创建请求时使用的方法
       method: 'get', // 默认值
     
       // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
       // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
       baseURL: 'https://some-domain.com/api/',
     
       // `transformRequest` 允许在向服务器发送前,修改请求数据
       // 它只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
       // 数组中最后一个函数必须返回一个字符串, 一个Buffer实例,ArrayBuffer,FormData,或 Stream
       // 你可以修改请求头。
       transformRequest: [function (data, headers) {
         // 对发送的 data 进行任意转换处理
     
         return data;
       }],
     
       // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
       transformResponse: [function (data) {
         // 对接收的 data 进行任意转换处理
     
         return data;
       }],
     
       // 自定义请求头
       headers: {'X-Requested-With': 'XMLHttpRequest'},
     
       // `params` 是与请求一起发送的 URL 参数
       // 必须是一个简单对象或 URLSearchParams 对象
       params: {
         ID: 12345
       },
     
       // `paramsSerializer`是可选方法,主要用于序列化`params`
       // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
       paramsSerializer: function (params) {
         return Qs.stringify(params, {arrayFormat: 'brackets'})
       },
     
       // `data` 是作为请求体被发送的数据
       // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
       // 在没有设置 `transformRequest` 时,则必须是以下类型之一:
       // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
       // - 浏览器专属: FormData, File, Blob
       // - Node 专属: Stream, Buffer
       data: {
         firstName: 'Fred'
       },
       
       // 发送请求体数据的可选语法
       // 请求方式 post
       // 只有 value 会被发送,key 则不会
       data: 'Country=Brasil&City=Belo Horizonte',
     
       // `timeout` 指定请求超时的毫秒数。
       // 如果请求时间超过 `timeout` 的值,则请求会被中断
       timeout: 1000, // 默认值是 `0` (永不超时)
     
       // `withCredentials` 表示跨域请求时是否需要使用凭证
       withCredentials: false, // default
     
       // `adapter` 允许自定义处理请求,这使测试更加容易。
       // 返回一个 promise 并提供一个有效的响应 (参见 lib/adapters/README.md)。
       adapter: function (config) {
         /* ... */
       },
     
       // `auth` HTTP Basic Auth
       auth: {
         username: 'janedoe',
         password: 's00pers3cret'
       },
     
       // `responseType` 表示浏览器将要响应的数据类型
       // 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
       // 浏览器专属:'blob'
       responseType: 'json', // 默认值
     
       // `responseEncoding` 表示用于解码响应的编码 (Node.js 专属)
       // 注意:忽略 `responseType` 的值为 'stream',或者是客户端请求
       // Note: Ignored for `responseType` of 'stream' or client-side requests
       responseEncoding: 'utf8', // 默认值
     
       // `xsrfCookieName` 是 xsrf token 的值,被用作 cookie 的名称
       xsrfCookieName: 'XSRF-TOKEN', // 默认值
     
       // `xsrfHeaderName` 是带有 xsrf token 值的http 请求头名称
       xsrfHeaderName: 'X-XSRF-TOKEN', // 默认值
     
       // `onUploadProgress` 允许为上传处理进度事件
       // 浏览器专属
       onUploadProgress: function (progressEvent) {
         // 处理原生进度事件
       },
     
       // `onDownloadProgress` 允许为下载处理进度事件
       // 浏览器专属
       onDownloadProgress: function (progressEvent) {
         // 处理原生进度事件
       },
     
       // `maxContentLength` 定义了node.js中允许的HTTP响应内容的最大字节数
       maxContentLength: 2000,
     
       // `maxBodyLength`(仅Node)定义允许的http请求内容的最大字节数
       maxBodyLength: 2000,
     
       // `validateStatus` 定义了对于给定的 HTTP状态码是 resolve 还是 reject promise。
       // 如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),
       // 则promise 将会 resolved,否则是 rejected。
       validateStatus: function (status) {
         return status >= 200 && status < 300; // 默认值
       },
     
       // `maxRedirects` 定义了在node.js中要遵循的最大重定向数。
       // 如果设置为0,则不会进行重定向
       maxRedirects: 5, // 默认值
     
       // `socketPath` 定义了在node.js中使用的UNIX套接字。
       // e.g. '/var/run/docker.sock' 发送请求到 docker 守护进程。
       // 只能指定 `socketPath` 或 `proxy` 。
       // 若都指定,这使用 `socketPath` 。
       socketPath: null, // default
     
       // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
       // and https requests, respectively, in node.js. This allows options to be added like
       // `keepAlive` that are not enabled by default.
       httpAgent: new http.Agent({ keepAlive: true }),
       httpsAgent: new https.Agent({ keepAlive: true }),
     
       // `proxy` 定义了代理服务器的主机名,端口和协议。
       // 您可以使用常规的`http_proxy` 和 `https_proxy` 环境变量。
       // 使用 `false` 可以禁用代理功能,同时环境变量也会被忽略。
       // `auth`表示应使用HTTP Basic auth连接到代理,并且提供凭据。
       // 这将设置一个 `Proxy-Authorization` 请求头,它会覆盖 `headers` 中已存在的自定义 `Proxy-Authorization` 请求头。
       // 如果代理服务器使用 HTTPS,则必须设置 protocol 为`https`
       proxy: {
         protocol: 'https',
         host: '127.0.0.1',
         port: 9000,
         auth: {
           username: 'mikeymike',
           password: 'rapunz3l'
         }
       },
     
       // see https://axios-http.com/zh/docs/cancellation
       cancelToken: new CancelToken(function (cancel) {
       }),
     
       // `decompress` indicates whether or not the response body should be decompressed 
       // automatically. If set to `true` will also remove the 'content-encoding' header 
       // from the responses objects of all decompressed responses
       // - Node only (XHR cannot turn off decompression)
       decompress: true // 默认值
     
     }

    axios实例

    <template>
        <div>
            111
        </div>
    </template>
    <script>
    import axios from 'axios'
    let newVar1 = axios.create({
        baseURL: "http://127.0.0.1:5000/keynav",
        timeout: 5000
    }); //创建一个axios实例
    newVar1({
        url: "/on_categorys",
        params: {
            id: 19
        }
    }).then((res) => {
        console.log(res);
    }).catch((res) => {
        console.log(res);
    });
    let newVar2 = axios.create({
        baseURL: "http://127.0.0.1:5000/keynav",
        timeout: 5000
    }); //创建一个axios实例
    newVar2({
        url: "/category"
    }).then((res) => {
        console.log(res);
    }).catch((res) => {
        console.log(res);
    });
    export default {}
    </script>

    axios拦截器

    axios给我们提供了两大类拦截器一种是请求方向的拦截(成功请求,失败的) 另一种是响应方向的(成功的,失败的)

    拦载器的作用,用于我们在网络请求的时候在发起请求或者响应时对操作进行可响应的外理 发起请求时可以添加网页加载的动画强制登录 可应的时候口以进行相应的数据外理

    请求方向的

    <template>
        <div>
            111
        </div>
    </template>
    <script>
    import axios from 'axios'
    axios.interceptors.request.use(config => {
        console.log("进入请求拦截器");
        console.log(config);
        return config;
    }, err => {
        console.log("请求方向失败");
        console.log(err);
    });
    
    axios.get("http://127.0.0.1:5000/keynav/on_categorys?id=19").then(res => {
        console.log(res);
    })
    export default {}
    </script>

    响应方向的

    <template>
        <div>
            111
        </div>
    </template>
    <script>
    import axios from 'axios'
    axios.interceptors.response.use(config => {
        console.log("进入响应拦截器");
        return config; //放行请求,若没有return这个语句,则不会执行语句外下面的axios.get()
        // return config.data;
    }, err => {
        console.log("响应方向失败");
        console.log(err);
    });
    
    axios.get("http://127.0.0.1:5000/keynav/on_categorys?id=19").then(res => {
        console.log(res);
    })
    export default {}
    </script>

    axios在vue中的模块封装

    方式一:封装者处理,调用者请求

    创建一个与网络请求相关的部分

    创建一个文件夹network,里面创建一个用来存放请求的文件夹request,里面创建一个axios的请求函数文件request.js,里面内容需要先导入axios模块,然后把函数暴露出去:

    封装者:src/network/request/request.js

    //封装者位置
    import axios from 'axios'
    export function request(config) {
        axios({
            url: config
        }).then(res => {
            console.log(res);
        })
    }

    然后在main.js中引入封装好的请求文件

    调用者位置:src/main.js

    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.use(ElementUI);
    Vue.prototype.axios = axios;
    Vue.config.productionTip = false;
    
    new Vue({
        render: h => h(App),
    }).$mount('#app');
    
    //引入封装好的请求文件
    //调用者位置
    import { request } from './network/request/request'
    request("http://127.0.0.1:5000/keynav/on_categorys?id=19")

    参数补全版

    //封装者位置
    import axios from 'axios'
    export function request(config, success, fail) { //参数:请求结果、成功、失败
        axios({
            url: config
        }).then(res => {
            success(res);
        }).catch(err => {
            fail(err);
        })
    }
    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.use(ElementUI);
    Vue.prototype.axios = axios;
    Vue.config.productionTip = false;
    
    new Vue({
        render: h => h(App),
    }).$mount('#app');
    
    //引入封装好的请求文件
    //调用者位置
    import { request } from './network/request/request'
    request("http://127.0.0.1:5000/keynav/on_categorys?id=19", res => {
        console.log(res);
    }), err => {
        console.log(err);
    }

    方式二:封装者请求,调用者处理

    在模块里进行请求,把请求的信息交给调用者去处理

    //封装者位置
    import axios from 'axios'
    export function request(config) { //参数:请求结果
        axios.defaults.baseURL = "http://127.0.0.1:5000/keynav";
        axios(config.url, { params: config.params }).then(res => {
            config.success(res);
        }).catch(err => {
            config.fail(err);
        })
    }
    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.use(ElementUI);
    Vue.prototype.axios = axios;
    Vue.config.productionTip = false;
    
    new Vue({
        render: h => h(App),
    }).$mount('#app');
    
    //引入封装好的请求文件
    //调用者位置
    import { request } from './network/request/request'
    request({
        url: '/on_categorys',
        params: {
            id: 19
        },
        success: res => {
            console.log(res);
        },
        fail: err => {
            console.log(err);
        }
    })

    方式三:封装者返回对象,调用者处理(推荐使用)

    封装者返回Promise对象,调用者使用then和catch方法处理响应结果或错误信息。

    //封装者位置
    import axios from 'axios'
    export function request(config) { //参数:请求结果
        return new Promise((resolve, reject) => {
            let newVar = axios.create({
                baseURL: "http://127.0.0.1:5000/keynav",
                timeout: 5000
            });
            newVar(config).then(res => {
                resolve(res);
            }).catch(err => {
                reject(err);
            })
        })
    }
    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.use(ElementUI);
    Vue.prototype.axios = axios;
    Vue.config.productionTip = false;
    
    new Vue({
        render: h => h(App),
    }).$mount('#app');
    
    //引入封装好的请求文件
    //调用者位置
    import { request } from './network/request/request'
    request({
        url: '/on_categorys',
        params: {
            id: 19
        },
    }).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    });

    方式四:封装者请求创建实例并返回Promise对象,调用者处理(推荐使用)

    通过封装者封装的request函数进行请求,使用axios.create方法创建实例,并返回Promise对象(封装者位置中的 return newVar(config); 是返回Promise对象的语句。)

    调用者使用Promise的then和catch方法处理响应结果或错误信息。

    //封装者位置
    import axios from 'axios'
    export function request(config) { //参数:请求结果
        let newVar = axios.create({
            baseURL: "http://127.0.0.1:5000/keynav",
            timeout: 5000
        });
        return newVar(config);
    }
    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue'
    import axios from 'axios'
    
    Vue.use(ElementUI);
    Vue.prototype.axios = axios;
    Vue.config.productionTip = false;
    
    new Vue({
        render: h => h(App),
    }).$mount('#app');
    
    //引入封装好的请求文件
    //调用者位置
    import { request } from './network/request/request'
    request({
        url: '/on_categorys',
        params: {
            id: 19
        },
    }).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    });