Linux 常用命令总结

网上找了不少 Linux 方面的资料,令我想不通的是,这么简单的东西,为什么可以写的这么复杂。。我本地装了一个 Ubuntu 虚拟机,云上装了一个 CentOS,用着用着就熟练了

Linux 的命令格式

[root@localhost~]#

  • root: 当前登录用户
  • localhost: 主机名
  • ~ : 当前所在目录
  • : 超级用户的提示符
  • $ : 普通用户的提示符
  • / 开头的是绝对路径
  • . 是当前目录,统计目录可以省略 ./
  • .. 当前目录的父目录
  • cd 更改当前目录到家目录
  • cd – 更改当前目录到先前的目录
  • 每个用户都有一个家目录,默认在 /home/用户名
  • root 用户的家目录是 /root

文件命令

常规

  • 命令格式 [选项] [参数]
  • tap 自动补全命令
  • 打印当前工作目录: pwd
  • 查看文件类型 file
  • 查询目录中内容 ls [选项] [文件或目录]
    • ls -l 显示所有文件
    • ls -lh 人性化显示所有文件
    • ls -a 显示所有文件 以.开头的都是隐藏文件
  • cd (change direcotry):
    • 更改工作目录到先前的工作目录
  • cp (copy):
    • cp a.txt b.txt
    • 复制 a.txt 并把新文件命名为 b.txt
    • 复制目录要加上 -r 参数 cp -r a b
  • mkdir (创建一个目录)
    • -p 可以一次性创建多层目录
    • mkdir -p a/b/c
  • rmdir (remove empty directories) 删除一个空目录
  • rm
    • 这个命令直接删除东西,很危险,一般不要用
    • 删除文件或者目录
    • -f 强制删除
    • -r 用来删除目录
  • mv (用来移动文件\文件夹 或者改名)
    • mv a.txt b.txt 此为改名
    • mv b.txt ../
    • mv b.txt ../gua.txt
    • 可以用 mv xx /tmp 的方式来将文件放入临时文件夹(/tmp 是操作系统提供的临时文件夹,重启会删除里面的所有文件,可以替代 rm 删除命令)
  • cat 显示文件内容
  • tac 反过来显示文件内容
  • nl 显示内容并附带行号
  • more(分屏分批看文件内容)
  • less(比 more 好用,可以前后退看文件)
  • head,tail (显示文件的前,后10行)
  • head 和 tail 有一个 -n 参数 head-n 20 a.txt 显示20行
  • touch a.txt 如果文件存在就更新修改时间,不存在就创建文件

文件解压缩

  • tar -cf name.tar name 压缩
  • tar -tf name.tar 显示压缩的文件 tar -tvf name.tar 显示详细信息(都是只显示,不解压。v表示显示详细信息)verbose(详细)
  • tar -xf name.tar 解压(抽取)
  • tar -czvf name.tar.gz name (加了一个 z,以gz格式压缩)
  • tar -tzvf name.tar.gz (加了一个 z,以gz格式查看)
  • tar -xzvf name.tar.gz (加了一个 z,以gz格式抽取)
  • tar -cvf|tvf|xvf tar -czvf|tzvf|xzvf 记住这一行就行了
  • compression(create)listextract(提取)

文件编辑(vim)

  • touch 可以新建文件,vim 也可以直接新建文件
  • 打开后,写入内容,按 i 键(insert)
  • 退出 按 esc :wq 保存退出
  • 移到第一行 gg;移到最后一行 G
  • 删除一整行 dd;恢复 u。前提是从 insert 模式中切换出来
  • 复制一整行 yy;粘贴 p
  • 文件的权限 r-w-x 4-2-1 读-写-可执行

权限操作

  • sudo 用管理员账户执行程序(安装程序或修改一些系统配置都需要管理员权限)
  • su (switch user) 切换用户 su root
  • ll 全部显示

信息查找

  • file 显示文件类型
  • uname 显示操作系统名字或者其它信息 -r(内核) -a(全部)
  • whoami 查看当前身份
  • find . -name “*.py” 查找所有以 .py 结尾的文件

符号

  • ~ 家目录快捷方式
  • > 覆盖式重定向
  • >> 追加重定向

网络

  • ifconfig(查看 ip 一般使用这个)
  • ip addr(也可查看 ip)

SSH

  • ssh,安全外壳协议,建立在应用层,专为远程登录会话和其它网络服务提供安全性的协议
  • 以下内容在 CentOs 中操作,Ubuntu 中相关文件位置自行 Google

服务器安装 SSH 服务

  • 安装 yum install openssh-server
  • 启动 service sshd start
  • 设置开机运行 chkconfig sshd on
  • 服务器版本的操作系统一般都已经装好。桌面版的可能没有

客户端安装 SSH 工具

  • windows下很多工具支持,Xshell,Putty,secureCRT
  • Linux平台安装 yum install openssh-clients
  • 客户端连接SSH服务 ssh root@公网ip 实际与新建会话是一样的+
  • exit 回到本地

SSH config(配置)

  • 以下讲的都是linux客户端的config),客户端的config才能对自己生效
  • config 方便管理员批量管理多个 ssh
  • config 存放在 ~/.ssh/config(.ssh目录下没有的话就touch config新建一个)
  • SSH config 语法关键字:
    • Host 别名
    • HostName 主机名
    • Port 端口(ssh服务的默认端口为22)
    • User 用户名
    • IdentityFile 密钥文件的路径
    • 配置了config之后,连接服务器直接 ssh 别名 “` host “tencent” HostName xxx.xx.x.xx User root Port 22

### SSH安全免密码登录:ssh  key

+ 普通登录:`ssh username@xxx.xx.x.xx`
+ ssh key 使用非对称加密方式生成公钥和私钥
+ 私钥存放在本地 `~/.ssh` 目录
+ 公钥可以对外公开,放在服务器的 `~/.ssh/authorized_keys` 
+ Linux 平台生成 ssh key:
	+ 客户端cd ~/.ssh/
	+ 客户端使用 ssh-keygen -t rsa 命令亦可 ssh-keygen -t dsa
	+ 服务端在 authorized_keys 文件中写入客户端生成的公钥
	+ 客户端将密钥加载到ssh服务中:`ssh-add ~/.ssh/私钥文件`
+ windows 平台生成 ssh key:
	+ 直接在 xshell 工具栏中生成
	+ 在 ~/.ssh 目录下建立 authorized_keys 文件,编辑放入公钥
+ 如果是新用户,则还要修改一下权限

cd /home/username/ chmod 700 .ssh cd /home/username/.ssh chmod 600 authorized_keys


### SSH安全端口

+ 避免服务器的远程连接端口被别人知道
+ 改变 SSH 服务端口:修改 `/etc/ssh/sshd_config`(里面也可以添加连接的端口,这是对服务器端的操作)

## 软硬件的安装、查看

### 软件操作(CentOs)

+ 软件包管理器: yum
+ 安装软件: `yum intall xxx`
+ 卸载软件: `yum remove xxx`
+ 搜索软件: `yum serach xxx`
+ 清理缓存: `yum clean packages`
+ 列出已安装: `yum list`
+ 软件包信息: `yum info xxx`

### 软件操作(Ubuntu)

+ `sudo apt-get install name` `sudo apt install`
+ 备份Ubuntu默认源地址 `sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup`
+ 更新源服务器列表,即 `/etc/apt/sources.list`
+ `sudo apt-get update` sudo apt install 
+ `sudo apt-get remove name` 删除包
+ `sudo apt-cache search package` 搜索软件包
+ `sudo apt-cache show package`  获取包的相关信息,如说明、大小、版本等

### 硬件操作

+ 内存: `free -m`
+ 硬盘:`df -h`
+ 负载: `w/top`
+ cpu: `cat /proc/cpuinfo`

## 其它

### kill

+ `sudo netstat -tnlp` 查看所有进程端口占用情况
+ `sudo kill xxpidxx` 杀死进程

### 防火墙

+ `yum install firewalld`				安装
+ `service firewalld start`			启动
+ `service firewalld status`			检查状态
+ `service firewalld stop/disable` 	关闭/禁用防火墙

+ 可能已默认安装,用 `yum list |grep firewall` 检查

+ `firewall-cmd --version` 	查看版本
+ `firewall-cmd --help`		查看帮助文档
+ `firewall-cmd --state`		查看运行状态

> 在防火墙有区域和端口的区分

+ `firewall-cmd --get-zones` 查看区域
+ `firewall-cmd --get-default-zone` 默认区域
+ `firewall-cmd --list-all-zone` 列出每一个区域的配置信息
+ `firewall-cmd --query-service=ssh` 查询服务
+ `firewall-cmd --remove-serivce=ssh` 删除服务
+ `firewall-cmd --add-service=ssh` 添加服务
+ `firewall-cmd --list-services` 列出所有服务
+ `firewall-cmd --query-port=22/tcp` 查询端口是否开启
+ `firewall-cmd --add-port=22/tcp` 开启端口
+ `firewall-cmd --remove-port=22/tcp` 关闭端口
+ `firewall-cmd --list-ports` 查看所有打开的端口

+ 端口和服务的概念
+ 删除服务后开启端口依然可以(已实测)
+ 安装了服务都会开启默认端口,不用特意操作。测试时关闭防火墙

### 提权 、上传、下载

+ 提权:sudo
+ root 下通过 visudo 命令将用户加入到文件中

Allows people in group wheel to run all commands

%wheel ALL=(ALL) ALL %rong ALL=(ALL) ALL “`

  • 一般不用 root 进行操作。都是将用户加入文件,用用户操作,特殊命令用 sudo 提权
  • 文件下载
    • wget wget http://www.baidu.com
    • curl curl -o filename http://www.baidu.com 将下载下来的文件命名为 filename
  • 文件上传
    • scp上传文件格式为 scp 文件名 用户@公网地址:路径 例:scp a.txt rong@192.168.x.xxx:/tmp/ (scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令)
    • 下载 scp rong@192.168.x.xxx:/tmp/a.txt ./ 格式为:scp 用户名@公网地址:服务器上文件地址 文件要保存的本机地址以上是 linux 下的操作,windows 下见下
    • 服务器上安装软件 yum install lrzsz(在linux里可代替ftp上传和下载)
    • 服务器端 rz 上传命令(服务器端 receive)
    • 服务器端 sz filename 从服务器端下载文件(服务器端 send)
    • ZMODEM 协议

高效能人士的七个习惯

习惯一:积极主动(个人愿景的原则)

人性的本质是主动而非被动地——人类确实能主动努力以提升生命价值(主观能动性)

积极主动,不仅指行事的态度,还意味着为人一定要对自己的人生负责

积极主动的人专注于“影响圈”,专心做自己力所能及的事情,能量是积极的,是影响圈不断扩大

影响圈的核心就是,作出承诺与信守诺言的能力

这是其他习惯的基础

习惯二: 以终为始(自我领导的原则)

以你的人生目标作为衡量一切的标准。由个人最重视的期许或价值观来决定一切

在做任何事情之前,都需要认清方向——定目标

你以什么为中心?你为谁而活?

以原则为中心

以永恒不变的原则作为生活重心,就能建立高效能的思维定势,也就能正确审视所有其他的生活中心。(一个人的思维定式能决定他的态度和行为)

原因:主动的选择,没有受到环境和他人的影响;最有效的选择,且长期可预料;基于原则所作出的选择,能提高自身的价值。

所以,撰写使命宣言并付诸实践(确定角色和目标)

书写个人使命宣言 —— 即人生哲学或基本信念 (个人宪法,基于正确原则的个人使命宣言也同样是评价一切的标准)

习惯三:要事第一(自我管理的原则)

把最重要的事情放在第一位,先做重要的事情

矩阵: 重要/不重要 * 紧急/不紧急

关注重要不紧急的事情

重要不紧急的事情: 建立人际关系,撰写使命宣言,规划长期目标,防患于未然等等

在必要时,勇于说“不”

学会授权

习惯四:双赢思维(人际领导的原则)

双赢 – 不断地在人际交往中寻求双边利益

要明确意识到其重要性

基础:信任

双赢关系

双赢的精髓就是信用,即情感账户

双赢过程: + 要从对方的角度看问题,真正理解对方的想法 + 认清主要问题和顾虑(而非立场) + 确定大家都能接受的结果 + 实现这种结果的各种可能途径

习惯五:知己知彼(移情沟通的原则)

首先寻求去了解对方,然后再争取让对方了解自己。(进行有效人际交流的关键)

你真的听懂了么?

移情聆听

以理解为目的的聆听,要求听者站在说话者的角度理解他们的思维模式和感受

不仅要耳到,还要眼到,心到。用眼睛去观察,用心灵去体会

有效的沟通: + 第一阶段,复述语句,至少能使人专心聆听 + 第二阶段,加入解释,纯用自己的词句表达,用左脑的逻辑思考去理解 + 第三阶段,深入个人的感觉,右脑发挥作用,开始体会对方的心情 + 即加以理解,又带有感情,左右脑并用

如果你真正爱一个人,那么花时间了解对方将有益于今后的坦诚相待

习惯六 :统合综效(创造性合作的原则)

统合综效的基本心态是——如果一位具有相当聪明才智的人跟我意见不同,那么对方的主张必定有我尚未体会的奥妙,值得加以理解

有分歧才有收获

统合综效就是整体大于部分之和

统合综效的精髓就是判断和尊重差异,取长补短

所谓统合综效的沟通,是指敞开胸怀,接纳一切奇怪的想法,同时也贡献自己的浅见

尊重差异,要尊重,不偏激

即使处于不利的境地,也不应该放弃追求统合综效

习惯七:不断更新(平衡的自我更新原则)

拥有财富,并不代表经济独立,拥有创造财富的能力才真正可靠

自我提升和完善的四个层面:身体,精神,智力,社会/情感

不断更新,意味着要兼顾这四种要素

身体层面:健康饮食、充足休息以及定期锻炼(耐力、人性、力量)

精神层面:人的本质,核心,对价值体系的坚持,是生活中非常私人但是至关重要的领域

智力层面:主要靠教育,借此不断学习知识,魔力心智,开阔视野;养成定期阅读优秀文学作品的习惯;另一种有效的方式是写作,不断记录自己的想法,经历深刻见解和学习心得

社会、情感层面:在与他人的日常交往中完成,还需要必要的练习;坚守原则,肯定自我,与人为善,相信人生不止输赢两种抉择;平衡,要把握平衡;螺旋式上升,良性循环,学习-坚持-时间,并沿着螺旋式上升的路线不断提高实践的层次

ORM,操作数据库

一 ORM是什么?为何要有ORM?

​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。

如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据库

针对应用程序的数据操作,直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下

#1. sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
#2. 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题

为了解决上述问题,django引入了ORM的概念,ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行

​ 有了ORM框架,开发人员既不用再去考虑原生SQL的优化问题,也不用考虑数据库迁移的问题,ORM都帮我们做了优化且支持多种数据库,这极大地提升了我们的开发效率

如何使用:
1、数据来源于数据库的表,而ORM的模型类对应数据库表,所以若我们想操作数据,必须先创建模型。
2、再注册到应用
3、再配置数据库连接
以下是一个 mysql的数据库连接配置,包含用的pymysql库,用户名zwq,密码5dc580,服务器zxz.xtaa.cn,数据库名douy
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://zwq:5dc580@zxz.xtaa.cn/douyin?charset=utf8"







Flask是一个轻量级的Web框架,其中集成的ORM工具SQLAlchemy,使得在Python中进行数据库操作变得更加简单。在Flask中,使用ORM可以通过使用db.session对象访问数据库,将操作转换为Python对象的方法。 在ORM中的一个核心概念是关系,即对象之间的关系。在Flask中,使用db.relationship来创建关系。本文将通过几个方面详细介绍db.relationship的使用。
一、创建一对多关系
在ORM中,一对多关系是指一个对象(如一个用户)可以有多个子对象(如多个订单)。在Flask中,可以通过db.relationship和backref参数来定义一对多关系。在这种关系中,一个对象(如User)可以有多个子对象(如Order),而一个子对象(如Order)只能归属于一个对象(如User)。

 class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))
        orders = db.relationship("Order", backref="user")

    class Order(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        total_price = db.Column(db.Float)
        user_id = db.Column(db.Integer, db.ForeignKey("user.id"))

    user = User.query.first()
    orders = user.orders
    for order in orders:
        print(order.total_price)

在这个示例中,User和Order模型之间建立了一对多关系。User模型中通过db.relationship定义了一个名为orders的属性。在Order模型中通过user_id列的外键来关联User模型。同时,backref参数定义了子对象如何访问父对象。在这个示例中,我们可以通过user.orders访问该用户的所有订单,并通过for循环遍历订单对象,打印其总价。

二、创建多对多关系

多对多关系是指两个对象之间相互关联,一个对象可以有多个子对象,同时一个子对象也可以归属于多个对象。在Flask中,可以通过db.relationship和secondary参数来定义多对多关系。在这种关系中需要创建一个关联表,用来保存多对多的关系。

association_table = db.Table(
        'association', db.Model.metadata,
        db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
        db.Column('project_id', db.Integer, db.ForeignKey('project.id')))

    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))
        projects = db.relationship("Project", secondary=association_table, backref="users")

    class Project(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))

    user = User.query.first()
    projects = user.projects
    for project in projects:
        print(project.name)

在这个示例中,User和Project模型之间建立了多对多关系。User模型中定义了名为projects的属性。在Project模型中同样定义了名为users的属性来反向访问父对象。关联表association_table通过db.Table来创建。在User模型中通过secondary参数来指定关联表。在示例中,我们可以通过user.projects访问该用户所参与的所有项目,并通过for循环遍历打印每个项目的名字。

三、定义关系属性的限制

在ORM中,还可以为关系属性定义一些限制,如elenment_order、primaryjoin、secondaryjoin等等。这些限制可以帮助我们更好地控制我们的关系。例如,为了控制查询结果,我们可以添加primaryjoin参数

四、使用back_populates来反向引用一对多关系

在Flask中,我们可以使用back_populates来反向引用一对多关系。这种方式可以帮助我们更好地控制关系,并避免循环引用

alist

https://github.com/alist-org/alist

有windows和liunx版本,可加入多种网盘,还可配合aria2等来离线下载。

如果要让别人查看的话在后台里把来宾帐户启用,再把无需密码访问选上。

安装后可以更改去掉相关特征信息

在设置-全局-自定义头部

<script src="https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll"></script>
<script src="https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll"></script>
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<style>
.footer {
    display: none!important;
}
body:before {
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    opacity: .3;
    z-index: -1;
    display: block;
    position: fixed;
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center center;
    background-attachment: fixed;
    content: '';
    background-image: url(https://oss.iymark.com/2022/09/vback.jpg);
}
.hope-c-PJLV-ikSuVsl-css {
  background: none!important;
}
.markdown-body a {
  color: #000!important;
}
.hope-ui-dark .markdown-body a {
  color: #fff!important;
}
.copyright .link {
    padding: 4px;
    background: #26517c;
    border-radius: 0 8px 8px 0;
}
.copyright .name {
    padding: 4px;
    background: #fff;
    border-radius: 8px 0 0 8px;
    color:#000;
}
.copyright {
    padding: 50px;
    background: #2d3236!important;
}
.copyright a {
  color: #fff;
}
br.phone, br.pad{
    display:none;
}
@media (max-width: 891px){
br.pad {
    display:block;
}
}
@media (max-width: 561px){
br.phone {
    display:block;
}
}
.hope-c-PJLV-ieESZju-css {
    display: none;
}
img.hope-c-PJLV-ibwASZs-css {
    width: auto;
}
.hope-ui-dark .copyright .name {
    background: #000;
}
.runtime {
    margin-top: 20px;
    color: #fff;
    text-align: right!important;
}
.about, .state {
    width: min(99%, 980px);
    text-align: center;
    padding-inline: 2%;
}
.state {
    margin-top: 20px;
    color:#fff;
}
</style>

在自己定义内容里

<div class="copyright" align="center"><div class="about"><p>
<span class="name">© 2020-2023</span><span class="link"><a href="https://www.xtaa.cn">奇言</a></span><br class="phone"><br class="phone">
</p>
<div class="runtime">
<span id="runtime_span"></span>
<script type="text/javascript">
    function show_runtime() {
        window.setTimeout("show_runtime()", 1000);
        X = new Date("2/24/2023 00:00:00");
        Y = new Date();
        T = (Y.getTime() - X.getTime());
        M = 24 * 60 * 60 * 1000;
        a = T / M;
        A = Math.floor(a);
        b = (a - A) * 24;
        B = Math.floor(b);
        c = (b - B) * 60;
        C = Math.floor((b - B) * 60);
        D = Math.floor((c - C) * 60);
        runtime_span.innerHTML = "<span class=\"name\">稳定运行" + A + "天</span><span class=\"link\">" + B + "时" + C + "分" + D + "秒</span>"
    }
    show_runtime();
</script>
</div>
</div>
<div class="state"><p>免责声明:本站为个人资源库,资源库所发布的一切影视、源代码、注册信息及软件等资源仅限用于学习和研究目的</p></div>
</div>




另外可容器直接安装已挂载大量内容的小雅alist:
http://alist.xiaoya.pro/
一键安装和更新容器,标准模式,打开端口 5678
bash -c "$(curl http://docker.xiaoya.pro/update_new.sh)"

一键安装和更新容器,host模式(推荐,软路由和NAS上更少网络故障,打开端口 6789)
bash -c "$(curl http://docker.xiaoya.pro/update_new.sh)" -s host

推荐个alist网盘聚合神器

https://github.com/alist-org/alist

有windows和liunx版本,可加入多种网盘,还可配合aria2等来离线下载。

如果要让别人查看的话在后台里把来宾帐户启用,再把无需密码访问选上。

安装后可以更改去掉相关特征信息

在设置-全局-自定义头部

<script src="https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll"></script>
<script src="https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll"></script>
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<style>
.footer {
    display: none!important;
}
body:before {
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    opacity: .3;
    z-index: -1;
    display: block;
    position: fixed;
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center center;
    background-attachment: fixed;
    content: '';
    background-image: url(https://oss.iymark.com/2022/09/vback.jpg);
}
.hope-c-PJLV-ikSuVsl-css {
  background: none!important;
}
.markdown-body a {
  color: #000!important;
}
.hope-ui-dark .markdown-body a {
  color: #fff!important;
}
.copyright .link {
    padding: 4px;
    background: #26517c;
    border-radius: 0 8px 8px 0;
}
.copyright .name {
    padding: 4px;
    background: #fff;
    border-radius: 8px 0 0 8px;
    color:#000;
}
.copyright {
    padding: 50px;
    background: #2d3236!important;
}
.copyright a {
  color: #fff;
}
br.phone, br.pad{
    display:none;
}
@media (max-width: 891px){
br.pad {
    display:block;
}
}
@media (max-width: 561px){
br.phone {
    display:block;
}
}
.hope-c-PJLV-ieESZju-css {
    display: none;
}
img.hope-c-PJLV-ibwASZs-css {
    width: auto;
}
.hope-ui-dark .copyright .name {
    background: #000;
}
.runtime {
    margin-top: 20px;
    color: #fff;
    text-align: right!important;
}
.about, .state {
    width: min(99%, 980px);
    text-align: center;
    padding-inline: 2%;
}
.state {
    margin-top: 20px;
    color:#fff;
}
</style>

在自己定义内容里

<div class="copyright" align="center"><div class="about"><p>
<span class="name">© 2020-2023</span><span class="link"><a href="https://www.xtaa.cn">奇言</a></span><br class="phone"><br class="phone">
</p>
<div class="runtime">
<span id="runtime_span"></span>
<script type="text/javascript">
    function show_runtime() {
        window.setTimeout("show_runtime()", 1000);
        X = new Date("2/24/2023 00:00:00");
        Y = new Date();
        T = (Y.getTime() - X.getTime());
        M = 24 * 60 * 60 * 1000;
        a = T / M;
        A = Math.floor(a);
        b = (a - A) * 24;
        B = Math.floor(b);
        c = (b - B) * 60;
        C = Math.floor((b - B) * 60);
        D = Math.floor((c - C) * 60);
        runtime_span.innerHTML = "<span class=\"name\">稳定运行" + A + "天</span><span class=\"link\">" + B + "时" + C + "分" + D + "秒</span>"
    }
    show_runtime();
</script>
</div>
</div>
<div class="state"><p>免责声明:本站为个人网盘,网盘所发布的一切影视、源代码、注册信息及软件等资源仅限用于学习和研究目的</p></div>
</div>

微软azure免费云服务器实操

进azure,

注册,绑卡(可用双币信用卡),

里面可以送200刀有效期1个月,第一个月内改成即用即付模式就liunx和windows各一台1年免费,如果1个月内没改就会直接帐户失效

还有一些其它始终免费的服务,比如翻译每月有200万的免费额度,个人完全够用。

创建虚拟机资源,注意选可以免费用的镜像和免费用的64G硬盘,在可用性选项中要选没有基础结构冗余的,大小选择B1s这种1核1G的,在网络中新建公网IP,在里面SKU选基本,动态IP,要不会产生费用,但弹性动态公网IP会在每次关机再启动后变动,直接重启是不变的,所以要固定IP的就会要另想办法。

选的ubuntu在建资源时一般会建一个azureuser用户,并下载一个ppm私钥,如连接不上可以在里面修改密码然后不用私钥,直接用密码连接,

我一般在创建时就直接选择用帐号密码,比如自己建一个帐号ppp,那你建好你的ubuntu机器后就直接用这个登录,如果要root权限,可以sudo passwd root先把root的密码设置下,然后su root就可以用了。

实测韩国中心区ping值88

要注意还有流量限制,每月只有15G,但好像有人说实际是100G,你可以在之前创建资源时建的《订阅》右下角有个热门免费服务,再在最下面的查看所有免费服务中查看免费资源的使用情况和到期时间等信息!

Flask实现频繁请求限制

要实现频繁请求限制,可以使用Flask插件Flask-Limiter来实现。以下是对代码的修改:

1. 首先,安装Flask-Limiter插件:
```
pip install flask-limiter
```

2. 在代码中导入Flask-Limiter和限制器的配置:
```python
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

# 在app之前配置限制器
limiter = Limiter(app, key_func=get_remote_address)
```

3. 在`get_file_url`函数上添加限制器的装饰器,并设置限制规则:
```python
@app.route('/api/fs/get')
@limiter.limit("10/minute")  # 设置每分钟最多允许10次请求
def get_file_url():
    ...
```

这样一来,每个IP地址每分钟最多只能发送10个请求。可以根据实际需要调整限制规则的参数。

注意:还可以根据需要设置其他限制规则,比如限制特定路径或特定用户的请求频率。详细文档可以参考Flask-Limiter的官方文档

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