Vue和Flask实现前后端分离

后端采用Flask提供几个Restfull风格的API,前端放弃惯用的flasky常用的Jinja模板引擎,采用灵活的Vue.js框架,顺便实践一把前后端分离。既然前后端分离,那么就需要在开发环境独立创建两个项目。下面逐一介绍。

安装node.js

安装vue,安装webpack,安装vue-cli,创建工程

vue是以组件为单位组织成复杂的页面。我们直接在componets下的HelloWorld.vue上进行代码调整和编写。template部分主要包含一个select元素,value对应后端API,触发button会向选择的后端API发送请求。script部分methods部分实现对元素事件的响应,通过axios与后端服务器进行通信,分别采用get和post方法。具体代码如下图:

<template>
  <div class="hello">
    <button @click="test">测试</button>
    <select v-model="selected" name="url-option">
      <option value="">选择一个Url</option>
      <option value="/api/speech/event_extraction">思必驰警情信息抽取</option>
      <option value="/api/speech/addr_fix">思必驰地址理解</option>
      <option value="/api/gaode/get_poi">高德关键字搜索</option>
    </select>
    <input v-model="input_query" style="width: 400px">
    <button @click="sendRequest">发送请求</button>
    <br></br>
    <textarea style="width: 600px; height: 300px">{{ resp }}</textarea>
  </div>
</template>

<script>
import axios from 'axios'
// 后端服务器地址
axios.defaults.baseURL = 'http://10.67.*.*:5000';
export default {
  name: 'HelloWorld',
  data () {
    return {
      selected: '',
      input_query: '',
      resp: ''
    }
  },
  methods: {
    test () {
      axios
        .get('/api/hello')
        .then(response => {
          console.log(response.data.name)
          this.resp = response.data.name
        })
        .cache(error => {
          console.error(error)
        })
    },
    sendRequest () {
      console.log(this.selected)
      axios
        .post(this.selected, {query: this.input_query})
        .then(response => {
          console.log(response)
          this.resp = response.data
        }).catch(error => {
          console.error(error)
        })
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
  font-weight: normal;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

在vue中还用

v-for 来在前端页面中做for循环,v-on:click=点击,v-if=表示IF语句

后端

打开pycharm,新建一个flask项目

在app.py里编写几个Restfull 风格的API,用于响应前端请求

from flask import Flask, jsonify, request
from flask_cors import CORS
import requests
import json

app = Flask(__name__)
# 实现跨域访问
cors = CORS(app, resources={r"*": {"origins": "*"}})

# get请求
@app.route('/api/hello')
def hello_world():
    content = {
            "name": "网站",
            "num": 3,
            "sites": [{"name": "Google", "info": ["Android", "Google 搜索", "Google 翻译"]},
                      {"name": "Runoob", "info": ["菜鸟教程", "菜鸟工具", "菜鸟微信"]},
                      {"name": "Taobao", "info": ["淘宝", "网购"]}],
            }

    return jsonify(content)

# post请求
@app.route('/api/gaode/get_poi', methods=['POST'])
def get_poi():
    json_data = request.get_json()
    url_prefix = "***"   
    url = url_prefix + '&keywords=' + json_data['query']
    headers = {"Content-Type": "application/json"}
    resp = requests.get(url, headers=headers)
    text = resp.json()
    return text

# 其它接口此处可进行补充.............

if __name__ == '__main__':
    app.run(
        # TODO 设置无效,原因未知
        # host='10.67.*.*',
        # port='5000',
        # debug=True
    )

通过 Data URI Scheme 的方式来引入图片到网页

常见的图片加载方式

一般而言,最常见的图片加载方式是 HTTP URI Scheme 简称 HTTP URI。例如:某图片存储在又拍云存储上,链接为 https://f.lxpzyy.top/upyun/upcdn.svg。我们可以通过引入图片 HTTP 链接的方式来加载图片。

除此之外,我们可以通过 Data URI Scheme 的方式来引入图片。

<img src=“data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGlu……/>

Data URI Scheme 的方式和 HTTP URI 的使用较为类似,只是看起来多了很多“乱码”。那这些乱码有什么作用呢?和 HTTP URI 相比,它有什么优势让我们选择它呢?

初识 Data URI

Data URI scheme 简称 Data URI ,是在 RFC2397 中进行定义的。目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。以上方的 Data URI 链接为例:

<img src=“data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGlu……/>

我们可以看到它由 data,image/svg+xml,base64 以及后面的字符串组成。

data:[][;charset=][;],

这几部分分别为:

  • data: 表示取得数据的协定名称,表明这是一个 Data URI。
  • mime type: 数据类型名称,也是就是 image/svg+xml,如果传入的是个 png 图片,那么可以指定类型为 image/png。
  • charset=: 可不填,默认是 charset=US-ASCII 编码。
  • base64: 是数据的编码方法。
  • encoded data: 经过 base64 编码后的数据。

我们可以看到,除去可不填的 charset=,使用 Data URI 必然会用到 base64 编码,那这个要如何获得呢?

如何获得 base64 编码

最简单的方式是直接上网找一个编码小工具。

现在网上有很多的 base64 编码小工具,他们可以直接将文件或者字符进行 base64 解编码。

除此之外各代码语言也都有其对应的 base64 编码方式,可以很方便地进行编码解码转换:

Data URI 的使用方式及优势

了解了 Data URI 的大致情况,我们来看看它要如何使用。

它主要有两种使用方式,第一种是将处理好的 Data URI 格式数据,放入 HTML 页面代码 img 标签的 src 属性中。这种方式的好处是减少了 HTTP 请求,缺点是无法进行缓存。另一种方式则是将 Data URI 放入到 css 里,优点是浏览器会积极缓存 css 文件来提升加载页面时的速度,缺点是增加了 css 的长度。

那么回到我们最初的问题 Data URI 比 HTTP URI 的优势是什么呢?

相比 HTTP URI,Data URI 拥有以下优势:

  • 使用 Data URI 能够有效减少 HTTP 请求数
  • 不依赖于网络环境,即没有网络的时候页面中的资源也可以被加载出来
  • 可以免除一些极小文件对 HTTP 请求的占用

当然 Data URI 也有不少缺点。经过 Base64 编码后的文件或者数据,通常来说比起原文件体积增大了30%左右,然后 Data URI 通常会写在 css 文件中,不易维护,另外手机端加载 Data URI 资源也比较消耗 CPU 资源。

相比之下,Data URI 还是很值得使用的,现在就有很多场景都使用 Data URI 的方式引入资源,比如百度首页的小图标以及谷歌的首页等。

如果想让网站拥有不同的加载方式,特别是避免因网络状况差导致的无法加载问题,那一定要试试 Data URI。

在考虑使用 Data URI 的过程中,我们可以从以下几点着重考虑:

  • 图片的实际尺寸比较小
  • 不经常更新的资源图片
  • 需要在页面中经常使用的图片

Flask中jsonify和json.dumps用法以及区别(简单案例)

环境:python3.6, Flask1.0.3

flask提供了jsonify函数供用户处理返回的序列化json数据,

而python自带的json库中也有dumps方法可以序列化json对象.

其二者的区别,写个简单的案例实测一下便见分晓。

from flask import Flask
from flask import jsonify
import json

app=Flask(__name__)
app.config['JSON_AS_ASCII'] = False

# 随便定义个json字典
dic={"a":1,"b":2,"c":"你好"}
@app.route('/jsonify')
def jsonifys():
    # Content-Type: application/json
    return jsonify(dic)

@app.route('/jsondumps')
def jsondumps():
    # Content-Type: text/html; charset=utf-8
    return json.dumps(dic,ensure_ascii=False)

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

1.我们先访问 http://127.0.0.1:5000/jsonify 地址查看jsonify返回的json内容为一个JSON格式的字典

{

“a”:1,

“b”:2,

“c”:”你好”

}

检查页面属性看Response内容:其中content-Type:application/json

2.再访问另一个地址 http://127.0.0.1:5000/jsondumps 查看返回的json内容差不多

{“a”:1,”b”:2,”c”:”你好”}

检查页面属性看Response内容:text/html

使用jsonify时响应的Content-Type字段值为application/json,

而使用json.dumps时该字段值为text/html。

ps:

使用jsonify方法是需要添加一句 app.config[‘JSON_AS_ASCII’] = False

而json.dumps方法需要添加参数 ensure_ascii=False

这样做可以避免显示中文乱码。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142355.html原文链接:https://javaforall.cn

宝塔-狂雨小说

bbs.kyxscms.com

PHP建议高一点,实践7.4可用,在PHP设置中安装fileinfo扩展

建好网站后上传源码,伪静态里要选择thinkphp,然后保存,

在数字库操作以下代码,来新建一个采集,然后进后台去采集,但采出来的好像有很多文章并不完整。应该是采集的原站就文章不完整。

INSERT INTO `ky_collect` (`id`, `title`, `charset`, `type`, `url_complete`, `url_reverse`, `pic_local`, `source_url`, `section`, `url_rule`, `url_merge`, `url_must`, `url_ban`, `relation_url`, `rule`, `category_way`, `category_fixed`, `category_equivalents`, `status`, `create_time`, `update_time`, `collect_time`, `update`) VALUES (NULL, 'http://www.shuquge.com/', 'auto', 'novel', '1', '0', '0', '[{"url":"http://www.shuquge.com/category/1_[内容].html","type":"1","param":["1","1227","1",0]},{"url":"http://www.shuquge.com/category/2_[内容].html","type":"1","param":["1","317","1",0]},{"url":"http://www.shuquge.com/category/3_[内容].html","type":"1","param":["1","853","1",0]},{"url":"http://www.shuquge.com/category/4_[内容].html","type":"1","param":["1","230","1",0]},{"url":"http://www.shuquge.com/category/7_[内容].html","type":"1","param":["1","308","1",0]}]', '<body>[内容]</body>', '<li><span class="s1">(*)</span><span class="s2"><a href="[内容1]">(*)</a></span>', '', '', '', '[{"title":"章节页","page":"default","chapter":"1","section":"<dt>(*)正文</dt>[内容]</div>","url_rule":"<dd><a href=\\"[内容1]\\">[章节标题]</a></dd>","url_merge":""}]', '{"category":{"field":"category","source":"default","rule":"<meta property=\\"og:novel:category\\" content=\\"[内容1]\\" \\/> ","merge":"","strip":""},"title":{"field":"title","source":"default","rule":"<meta property=\\"og:novel:book_name\\" content=\\"[内容1]\\" \\/> ","merge":"","strip":"","replace":""},"author":{"field":"author","source":"default","rule":"<meta property=\\"og:novel:author\\" content=\\"[内容1]\\" \\/> ","merge":"","strip":"","replace":""},"serialize":{"field":"serialize","source":"default","rule":"<meta property=\\"og:novel:status\\" content=\\"[内容1]\\" \\/>","merge":"","serial":"连载中","over":"完结","strip":"","replace":""},"pic":{"field":"pic","source":"default","rule":" <meta property=\\"og:image\\" content=\\"[内容1]\\" \\/> ","merge":"","strip":"","replace":""},"content":{"field":"content","source":"default","rule":" <meta property=\\"og:description\\" content=\\" [内容1]\\" \\/> ","merge":"","strip":"","replace":""},"tag":{"field":"tag","source":"default","rule":"<meta property=\\"og:title\\" content=\\"[内容1]\\" \\/> ","merge":"","strip":"","replace":""},"chapter_title":{"field":"chapter_title","source":"0","rule":"<h1>[内容1]<\\/h1>","merge":"","strip":"","replace":""},"chapter_content":{"field":"chapter_content","source":"0","rule":"<div id=\\"content\\" class=\\"showtxt\\">[内容1]<br \\/>","merge":"","strip":"","replace":"[{\\"find\\":\\"<br\\/>\\",\\"replaces\\":\\"\\"}]"}}', '0', '0', '[{"target":"玄幻魔法","local":"18"},{"target":"武侠修真","local":"19"},{"target":"都市言情","local":"21"},{"target":"历史军事","local":"20"},{"target":"科幻灵异","local":"22"}]', '1', '1586771330', '1586774583', '1586793887', '0')

静态网站的免费存放

一、vercel是一个站点托管平台,可以托管静态网页,可以放个hexo博客系统在上面

二、Github Pages是完全基于Github创建的,也就是说你的博客站点实际上就是你的Github账户下的一个特殊的repo。所以,点击“New repository”新建一个仓库。
  而这个repo的特殊之处就是,它的名字必须是“username.github.io”(划重点啦,不要打瞌睡!),其中,username就是你的Github账户的用户名

同类的平台有Netlify等

把自己的域名做为邮箱后缀

新注册了个域名,想要有自己域名后缀的邮箱,

可以先到PC版企业微信注册帐号,进去后点‘邮件’进去,里面有个邮箱域名,设置成自己的域名,

并按要求先到域名注册商把域名设置两个MX记录,一个CNAME记录,验证通过就设置好自己的域名了,

然后在PC版企业微信进 邮件-邮箱管理-业务邮箱 进去后新增一个业务邮箱,并获取到密码,

这时你就可以按提示用foxmail等软件来收发邮件了,

如果不想用软件来收发邮件,则可用以下个人QQ邮箱来管理收发邮件

进自己的个人QQ邮箱-设置-其它邮箱

在里面’添加代收邮箱账户‘,然后填入邮箱地址,和之前获取的密码,

然后就可以在个人的邮箱里代收你自己域名邮箱的邮件了。发邮件时在’发件人‘选项卡中选择自己域名邮箱的这个账号就可以发邮件了

我的自有域名邮箱xtaa@xtaa.cn

windows双网卡路由优先设置

先用route print查一下路由表,如果两个网卡会有两个默认路由,这时跃点数越低的优先级越高,
我们可以在网卡属性中的intinternet协议版本ipv4设置中的高级选项卡中取消自动跃点设置,自己设置跃点数来改变两个路由的优先级。

android平台googleplay环境

最近有很多朋友来咨询我如何下载谷歌验证器。安卓手机下载谷歌验证器需要通过Google Play,而小米、华为等安卓手机因为手机供应商提供的版本不同,会限制,手机无法运行Google应用程序。这篇文章以小米手机为例,教大家如何在安卓手机上运行Google Play。

步骤如下:1、打开应用商店,搜higoplay安装器(如果要收费用后面的),如果没有则

搜索“豌豆荚”,下载“豌豆荚”App

在豌豆荚APP中搜索“谷歌安装器”,找到“SU谷歌安装器”(也可能更名为SuPlay安装器),或者到极光下载站等百度网站搜索也可以下,点击下载-安装

分别下载和安装对应的谷歌服务:谷歌服务框架、谷歌play服务、谷歌商店5、安装完成,登陆您的Google账户,即可使用Google Play功能。