flask全局变量一,视图间的参数传递

提出的问题:

flask视图间如何传递变量呢?开始我用的全局变量,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from flask import Flask,request,render_template

app=Flask(__name__)

app.secret_key = '就得是要一个key' # 必须有
app.config['SESSION_TYPE'] = 'filesystem' # 必须有

start_num=0
span_num=5

@app.route("/fun1")
def fun1():
start_num=9
span_num=16

@app.route("/fun2")
def fun2():
print("start_num=",start_num) #此处start_num又变为0
print("span_num=",span_num]) #此处start_num又变为5

在执行视图fun2时, session[“start_num”]与session[“span_num”]的值又变为初始值了。
咋整呢?

网上找到一种办法是 session法。修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask,request,render_template
from flask import session

app=Flask(__name__)

app.secret_key = '我的key'
app.config['SESSION_TYPE'] = 'filesystem'

session["start_num"]=0
session["span_num"]=5

@app.route("/fun1")
def fun1():
session["start_num"]=9
session["span_num"]=16

@app.route("/fun2")
def fun2():
print("session["start_num"]",session["start_num"]) #此处session["start_num"]又变为9
print("session["span_num"]",session["span_num"]) #此处session["start_num"]又变为16
还有一种办法就是把两个临时值传到数据库,或保存为json数据,存入文件中,程序不难,但是如果参数频繁改变的话,要反复读写文件就不好玩了。

flask 的form学习之二,Flask-WTF

使用 Flask-WTF的好处是直接在python中定义表单中的字段,比较直观

1
$ pip install flask-WTF

一. WTForms支持的全部HTML标准字段

字段对象 说明 相当于html的语句
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码字段
HiddenField 隐藏文件字段
DateField 文本字段,值为datetime.date文本格式
DateTimeField 文本字段,值为datetime.datetime文本格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal数
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True或False <input type=”radio”
RadioField 一组单选框
SelectField 下接列表
SelecMultipleField 可选择多个值的下接列表
FileField 文件上传
SubmitField 表单提交按钮
FormField 把表单做为字段嵌入另一个表单
FieldList 一组指定类型的字段

二 python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from flask import Flask
from flask import render_template
from flask_wtf import FlaskForm
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,
SelectField, SelectMultipleField, TextAreaField,
RadioField, IntegerField, DecimalField, SubmitField)
from wtforms.validators import DataRequired, InputRequired, Length, Email, EqualTo, NumberRange


app = Flask(__name__)
app.secret_key = 'asdfs'


class WtfForm(FlaskForm):
# StringField 文本输入框,必填,用户名长度为4到25之间,占位符
username = StringField('用户名:', validators=[Length(min=4, max=25)], render_kw={'placeholder': '请输入用户名'})

# Email格式
email = StringField('邮箱地址:', validators=[Email()], render_kw={'placeholder': '请输入邮箱地址'})

# PasswordField,密码输入框,必填
password = PasswordField('密码:', validators=[DataRequired()], render_kw={'placeholder': '请输入密码'})

# 确认密码,必须和密码一致
password2 = PasswordField('确认密码:', validators=[InputRequired(), EqualTo('password', '两次密码要一致')])

# IntegerField,文本输入框,必须输入整型数值,范围在16到70之间
age = IntegerField('年龄:', validators=[NumberRange(min=16, max=70)])

# DecimalField,文本输入框,必须输入数值,显示时保留一位小数
height = DecimalField('身高(cm):', places=1)

# DateField,文本输入框,必须输入是"年-月-日"格式的日期
birthday = DateField('出生日期:', format='%Y-%m-%d')

# RadioField,单选框,choices里的内容会在ul标签里,里面每个项是(值,显示名)对
gender = RadioField('性别:', choices=[('0', '男'), ('1', '女')], validators=[DataRequired()])

# SelectField,下拉单选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
job = SelectField('职业:', choices=[
('teacher', '教师'),
('doctor', '医生'),
('engineer', '工程师'),
('lawyer', '律师')
])

# Select类型,多选框,choices里的内容会在Option里,里面每个项是(值,显示名)对
hobby = SelectMultipleField('爱好:', choices=[
('0', '吃饭'),
('1', '睡觉'),
('2', '敲代码')
])

# TextAreaField,段落输入框
description = TextAreaField('自我介绍:', validators=[InputRequired()], render_kw={'placeholder': '例:小明,18岁,未婚找女友'})

# BooleanField,Checkbox类型,加上default='checked'即默认是选上的
accept_terms = BooleanField('是否接受上述条款', default='checked', validators=[DataRequired()])

# SubmitField,Submit按钮
submit = SubmitField('提交')


@app.route('/', methods=['POST', 'GET'])
def index():
form = WtfForm()
return render_template('wtf.html', form=form)

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

三. html代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="">
{{ form.csrf_token }}
{{ form.username.label }}{{ form.username }}
<br>
{{ form.email.label }}{{ form.email }}
<br>
{{ form.password.label }}{{ form.password }}
<br>
{{ form.password2.label }}{{ form.password2 }}
<br>
{{ form.age.label }}{{ form.age }}
<br>
{{ form.height.label }}{{ form.height }}
<br>
{{ form.birthday.label }}{{ form.birthday }}
<hr>
{{ form.gender.label }}{{ form.gender }}
<br>
{{ form.job.label }}{{ form.job }}
<br>
{{ form.hobby.label }}{{ form.hobby }}
<br>
{{ form.description.label }}{{ form.description }}
<br>
{{ form.accept_terms.label }}{{ form.accept_terms }}
<br>
{{ form.submit }}
<br>

</form>
</body>
</html>

flask 的form学习之一,传统form

传统的方法与php一样,先在html里建立form,并用action指向视图函数处理,并用POST方法传递参数。不多说,代码说明。

一. html文件 form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" >
<title>表单示便</title>
</head>
<body>
<form action="regist",method="POST" >
用户名:<input type="text",name="username"><br>
密码:<input type="text",name="pawd"><br>
再次密码::<input type="text",name="re-pawd"><br>
<input type="submit",value="注册"><br>
</form>
</body>
</html>
二. python代码中的视图函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from flask import Flask,request,render_template

app=Flask(__name__)

@app.route(/)
def index():
return render_template("index.html")

@app.route("regist")
def regist():
if request.method=="GET":
return render_template("regist.html") # 没有输入的样子就是这个。
if request.methom=="POST":
uname=request.form.get("username")
password=request.form.get("pawd")
re_password=request.form.get("re-pawd")
#下面添加处理语句

if __name__=="__main__":
app.debug=True
app.run(host = '127.0.0.1',port = 8080 )

flask打开Excel文件,并传给luckysheet显示

flask是个很好的网站框架,luckysheet的是一个很好的采用JS编写的表格框架,由于我一直采用flask,没有学习过javascript,所以想利用方便的lucksheet,如何结合呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#coding:utf8
from flask import Flask
from flask import request,render_template
import pandas as pd
import numpy as np
# from werkzeug import secure_filename
import os

app=Flask(__name__)

# 以下函数把一个excel表格读出,然后把数据转换成luckysheet的celldata,以便采用luckysheet显示在网页上
def pands_to_luckysheet(file_name):
sheet_data=[] # 定义一个空列表

data_f = pd.read_excel(file_name)

none_nan=(data_f.isnull()) | (data_f.apply(lambda x: str(x).isspace())) # 找到所有的None
data_f=data_f[~none_nan] # 把所有的None替换为nan
# print("data_f2=",data_f)
data_f=data_f.fillna("") # 把所有的nan替换为空字符
# print("data_f3=",data_f)
row=len(data_f) # 行数
col=len(data_f.columns) #列数
# 打算把数据转换为luckysheet的celldata数据
for i in range(row):
for j in range(col):
# sheet_data[k]=[{"r":i,"c":j,"v":{"v":data_f.iloc[i,j]}}]
# k=k+1
sheet_data.append({"r":i,"c":j,"v":{"v":data_f.iloc[i,j],"m":data_f.iloc[i,j]}}) # 添加列表项
return sheet_data
# print("测试luckckyshee数据转换")
# print(sheet_data)

@app.route("/table_channel")
def table_channel():
sheet_data=pands_to_luckysheet("/home/mywork/2021/汇总.xlsx")
# print("sheet_data=",sheet_data)
return render_template("index.html" ,lucky_data=sheet_data)

streamlit学习笔记四-----暂称为组件吧

创建静态组件

如果您创建 Streamlit 组件的目标仅仅是显示 HTML 代码或从 Python 可视化库中呈现图表,Streamlit 提供了两种方法来极大地简化流程:components.html() 和 components.iframe()。

  1. 渲染一个 HTML 字符串用:

    1
    streamlit.components.v1.html(html, width=None, height=None, scrolling=False)

    html (str) – 要嵌入 iframe 的 HTML 字符串。注意是字符串,如果是文件名,则会出错

width (int) – 以 CSS 像素为单位的框架宽度。 默认为报告的默认元素宽度。

height (int) – 以 CSS 像素为单位的框架高度。 默认为 150。

scrolling (bool) – 如果为 True,则在内容大于 iframe 时显示滚动条。 否则,不显示滚动条。 默认为假。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import streamlit as st
import streamlit.components.v1 as components

# bootstrap 4 collapse example

html_data= """
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<div id="accordion">
<div class="card">
<div class="card-header" id="headingOne">
<h5 class="mb-0">
<button class="btn btn-link" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Collapsible Group Item #1
</button>
</h5>
</div>
<div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
Collapsible Group Item #1 content
</div>
</div>
</div>
<div class="card">
<div class="card-header" id="headingTwo">
<h5 class="mb-0">
<button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Collapsible Group Item #2
</button>
</h5>
</div>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
<div class="card-body">
Collapsible Group Item #2 content
</div>
</div>
</div>
</div>
"""
components.html(html_data, width=None, height=300,scrolling=False)
)
  1. 呈现 iframe URL用用:

    1
    streamlit.components.v1.iframe(src, width=None, height=None, scrolling=False)

    参数
    src (str) – 要嵌入的页面的 URL。

width (int) – 以 CSS 像素为单位的框架宽度。 默认为报告的默认元素宽度。

height (int) – 以 CSS 像素为单位的框架高度。 默认为 150。

scrolling (bool) – 如果为 True,则在内容大于 iframe 时显示滚动条。 否则,不显示滚动条。 默认为假。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import streamlit as st
import pandas as pd
import numpy as np
import streamlit.components.v1 as components

st.set_page_config( page_title="Streamlit 练习 ", layout="wide" )

page_html_luckysheet = """
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<div id="accordion">
<div class="card">
<div class="card-header" id="headingOne">
<h5 class="mb-0">
<button class="btn btn-link" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Collapsible Group Item #1
</button>
</h5>
</div>
<div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
Collapsible Group Item #1 content
</div>
</div>
</div>
<div class="card">
<div class="card-header" id="headingTwo">
<h5 class="mb-0">
<button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Collapsible Group Item #2
</button>
</h5>
</div>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
<div class="card-body">
Collapsible Group Item #2 content
</div>
</div>
</div>
</div>
"""
# st.markdown( page_html_head, unsafe_allow_html=True)
container_top = st.container()
container_body = st.container()

# Top
with container_top:
st.markdown(" [新浪网](https://www.sina.com.cn) /[我的笔记](https://superigbt_superigbt.gitee.io) ")
st.image("/home/frankli/temp/建站/banner/mybanner4-1.jpg",caption='my banner', use_column_width=True)


# Body
with container_body:
# components.iframe( "https://superigbt_superigbt.gitee.io/")
left_side, right_side = st.columns([1,6])
# 左边,注意with语句的下一行缩进
with left_side:
left_side.subheader(" 左边的窄列,预留菜单树 ")
# 右边,注意缩进。
with right_side:
components.html( page_html_luckysheet )
components.iframe("https://superigbt_superigbt.gitee.io",width=None, height=600, scrolling=True)

panda笔记1

一. Python 将数据框 DataFrame转为html表格,DataFrame.to_html()详解
1
2
3
4
DataFrame.to_html(buf=None, columns=None, col_space=None, header=True, index=True,na_rep='NaN', formatters=None,
float_format=None, sparsify=None, index_names=True,justify=None, bold_rows=True,classes=None,
escape=True, max_rows=None, max_cols=None,show_dimensions=False, notebook=False, decimal='.',
border=None)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
buf : StringIO-like, 可选
写入缓冲区。
columns : sequence,可选
要转化的列的列名;默认值 None 为所有列转化。
col_space : int,可选
每列的最小宽度。
header : bool,可选
是否打印列标签,默认为 True。
index : 布尔值,可选
是否打印索引(行)标签,默认为 True。
na_rep : 字符串,可选
指定 NAN 的字符串表示形式,默认为 'NaN'。
formatters : 多个单参数函数组成的列表或字典,可选
格式化程序可按列表的所索引或字典的键名称应用于列元素,默认为 None。
每个单参数函数的结果必须是一个 unicode 字符串。列表的长度必须等于列数。
float_format: 单参数函数,可选
用于将列元素设置为浮点数的格式化程序功能,默认为无。
此单参数函数的结果必须是 unicode 字符串。
sparsify : bool,可选
默认为 True。输入 False 时,对于具有层次结构索引的 DataFrame,会在每一行打印多重索引。
index_names : bool,可选
打印索引名称,默认为 True。
line_width : int,可选
换行符的宽度,默认为不换行。
justify : 列标签对齐方式, 可选
左右对齐列标签。默认为 None时,使用打印配置中的选项(由 set_option 控制),则右对齐。
bold_rows : bool, 可选
对横向表格线进行加粗。
classes : CSS类(es)适用于生成的html表, 可选
默认 None
escape : bool, 可选
将 "<", ">", "&" 转化成 html 安全序列(??),默认 True。
max_rows : int, 可选
显示最大行数。
max_cols : int, 可选
显示最大列数。
decimal : str, 可选
小数分隔符, 默认为 '.'。
border : int, 可选
表格外边框宽度,默认为 1,参数为 0 时表格无边框。数值越大外边框越宽。
二. pd.read_excel方法说明
1
2
3
4
5
6
pd.read_excel(io, sheet_name=0, header=0, names=None,      index_col=None, 
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True, **kwds)
1
2
3
4
5
6
io:excel文件
sheet_name:返回指定sheet,默认索引0返回第一个,也可用名称,如果返回多个则可用列表,为None则返回全表
header:指定表头,也可用列表指定多行
names:自定义列名,长度和Excel列长度必须一致
index_col:用作索引的列
usecols:读取指定的列,参数为列表,如[0,1]表示第1和第2列
三. 使用to_excel()函数将DataFrame导出到excel文件
1
2
3
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None,
header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True,
encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
excel_writer:文件路径或现有的ExcelWriter。
sheet_name:它是指包含DataFrame的工作表的名称。
na_rep:指定要写入的表如果有空值(NAN),则需要填入的字符串。
float_format:这是一个可选参数, 用于格式化浮点数字符串。
columns:指定哪些列要写入新表。
header:是否把列名也写入excel表,默认为True,即写入
index:是否把索引也写入excel表,默认为True,即写入。
index_label:引用索引列的列标签。如果未指定, 并且标头和索引为True, 则使用索引名称。如果DataFrame使用MultiIndex, 则应给出一个序列。
startrow:默认值0。它指向转储DataFrame的左上单元格行。
startcol:默认值0。它指向转储DataFrame的左上方单元格列。
engine:这是一个可选参数, 用于写入要使用的引擎, openpyxl或xlsxwriter。
merge_cells:返回布尔值, 其默认值为True。它将MultiIndex和Hierarchical行写为合并的单元格。
encoding:这是一个可选参数, 可对生成的excel文件进​​行编码。仅对于xlwt是必需的。
inf_rep:它也是一个可选参数, 默认值为inf。它通常表示无穷大。
verbose:返回一个布尔值。它的默认值为True。
它用于在错误日志中显示更多信息。
Frozen_panes:它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。

值得一读!冯巩的54句经典语,这才是真正的幽默!句句有智慧

01、姑娘们啊!哪有那么多白马啊?找个驴凑合得了,别等到有一天驴都被抢没了,剩一堆骡子…

02、所谓美女,三分长相七分打扮、所谓气质,三分才气七分装蒜、所谓温柔,三分忍让七分压抑。

s.

03、下辇子要做筷子,就不孤单了!

04、你的话,我连标点符号都不信。

05、此处不留爷,自有留爷处。处处不留爷,爷回家做家务。

06、铁公鸡还会留点儿铁锈呢,你根本就是个不锈钢公鸡!

07、陪我一起数星星吧,你智商低你就数月亮吧!

08、我太佩服我自己了,有时候照镜子的时候都给自己磕头!

09、最有魅力的人是“康师傅”,天天都有成千上万的人泡他。

10、想你想得饭都吃不下,真是太恶心了!

11、其实我以前个子挺高的,只不过后来经常洗澡缩水了而已。

12、为什么我一直感觉不幸福,难道是当幸福来敲门的时候,我不在家?

13、干掉熊猫,我就是国宝!

14、别和我谈理想,戒了!

15、跌倒了,爬起来再哭!

16、低调!才是最牛B的炫耀!!

17、不吃饱哪有力气减肥啊?!
18、真不好意思,让您贱笑了
19、我能抵抗一切,除了诱惑。

20、老子不但有车,还是自行的。

21、点的是烟、抽的却是寂寞。

22、不是你不笑,一笑粉就掉!

23、人又不聪明,还学别人秃顶。

24、绑不住我的心就不要说我花心!

25、再牛b的肖邦,也弹不出老子的悲伤!

26、活着的时候开心点,因为我们要死很久。

27、请你以后不要在我面前说英文了,OK?
28、我这人从不记仇,一般有仇当场我就报了。

29、没什么事不要找我,有事更不用找我!

30、我那么喜欢你,你喜欢我一下会死啊?

31、我又不是人民币,怎么能让人人都喜欢我?

32、男人的话就像老太太的牙齿,有多少是真的?

33、问:你喜欢我哪一点?答:我喜欢你离我远一点!

34、执子之手,方知子丑,泪流满面,子不走我走。

35、诸葛亮出山前,也没带过兵!凭啥我就要工作经验?

36、珍惜生活——上帝还让你活着,就肯定有他的安排。

37、师太,你是我心中的魔,贫僧离你越近,就离佛越远……

38、初中的体育老师说:谁敢再穿裙子上我的课,就罚她倒立。

39、自己选择45°仰视别人,就休怪他人135°俯视着看你。

40、如果你看到面前的阴影,别怕,那是因为你的背后有阳光!

41、我允许你走进我的世界,但绝不允许你在我的世界里走来走去。

42、人永远不知道谁哪次不经意的跟你说了再见之后就真的再也不见了。

43、一分钟有多长?这要看你是蹲在厕所里面,还是等在厕所外面……

44、爱,就大声说出来,因为你永远都不会知道,明天和意外,哪个会先来!

45、你永远看不到我最寂寞的时候,因为在看不到你的时候就是我最寂寞的时候!

46、听说女人如衣服,兄弟如手足,回想起来,我竟然七手八脚地裸奔了二十多年!

47、今天心情不好,我只有四句话想说,包括这句和前面的两句,我的话说完了!

48、铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。

49、就算是一坨屎,也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。

50、如果中了一千万,我就去买30套房子租给别人,每天都去收一次房租。哇咔咔~~充实!

51、“恋”是个很强悍的字。它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。

52、再过几十年,我们来相会,送到火葬场,全部烧成灰,你一堆,我一堆,谁也不认识谁,全部送到农村做化肥。

53、我爸说过的最让我感动的一句话:“孩子,好好学习吧,爸以前玩麻将都玩儿10块的,现在为了供你念书,改玩儿1块的了。”

54、同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!

吐槽网络小说1

看网络小说总结出几个糟点一

  1. 禽兽不如, 就是撩一堆漂亮妹纸,把妹纸们撩的YXYS,就是一个都不吃,哇,现代柳下惠。
  2. 写富二代开跑车,带几个漂亮妹纸就是好色+绿茶婊组合,自己同样做了就是香帅+红颜知己组合
  3. 书中写着痛恨官二代仗势敛财,官商勾结。主人公却与另一个官二代合作发财做大,正义满满。
  4. 书中写别的有钱青年多交女友就是二代寻花问柳,渣男一个。自己同样做就是年少多金,暖男多情。
  5. 主人公从来不努力学习,学习过程都是把知识当水一样灌进大脑。
  6. 上大学必然会逃避军训,然而后面学习工作还能吃得苦中苦?
  7. 上大学一定常逃课去创业。说实在的,你何必去上大学呢?
  8. 穿越回古代号称做美食家,然后用臭豆腐,烤红薯,甚至方便面来糊弄人,古人真是傻啊。
  9. 老邵是对教肓捐款最多的人,你们从逸夫楼里学习出来的学子们穿越到港综,为个港毒明星踩六叔,一定要把他搞破产。唉,一群白眼狼。

利用vscode remote-browser插件功能编辑termux下的代码

前面说过安装wcode或code-server给termux增加远程编辑功能,让有大显示器的PC机通过浏览器来编辑termux上的代码。

#### 2022年9月,code-server更新了,在termux0.118版本安装方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ pkg install -y \
build-我essential \
binutils \
pkg-config \
python3 \
nodejs-lts
$ npm config set python python3
$ node -v # 查看node版本
$ npm install --global code-server --unsafe-perm
# 如果有报错,可能是用老方法安装,组件缺失引起以前安装错误,这里先执行一下
$ npm cache clean -f
然后再安装
$ code-server # 然后退出
$ ~/.config/code-server/config.yaml #更改端口与密码

一. 老方法再次回顾一下。

1
2
3
4
5
6
7
8
# 安装wcode并执行,wcode九年没有更新了,功能缺失
$ npm install -g wcode
$ wcode -p 8090 myblog/source/
# 安装code-server,配置后执行
$ npm install -g code-server
$ code-server # 运行成功后,再退出。
$ cd ~/.config/code-server
$ vim config.yaml # 更改端口与密码

然后在PC端浏览器输入 192.168.x.x:8090,就可象vscode一样的编辑打开termux下的文件了

以上两个软件的好处是本机运行简单,掉线上浏览器刷新可重新连接,但是特别耗电。用了一会儿,手机发烫,肿么办?

二 利用termux的ssh server与Vscode的remote-browser插件配合,也能实现。

  1. 在termux下安装openssh,并配置运行,见我的另一篇笔记。然后运行

    1
    $ sshd
  2. 在PC端的vccode安装remote-broswer插件

  3. vscode下菜单–>文件–>首选项–>设置–>左侧列表里选“扩展”—>remote-browser configuration–>在settings.json中编辑,然后会弹出编辑页面。增加语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #添加远程登录的主机地址、用户账号及访问的端口即可
    "remoteBrowser.connectionOptions": {

    "host": "192.168.x.x",

    "username": "u0_axxx",

    "port": 8022

    },

    保存后退出

  4. 在vscode下,按下快捷键 Crl+Shit+P, 在弹出的菜单中选择 remote-browser: connect, 然后会有刚才编辑的选项 192.168.x.x,选择后,会弹出输入密码的对话框,输入密码连接。如果连接成功,会在右下解显示remote-browser:Connected

  5. 然后点击,vscode左侧的“资源管理器”图标。会有一个”REMOTE BROWSER”的选项,点击后,会看到termux的目录,然后打开文件吧

第二种办法,手机只运行ssh server,损耗小,不会掉电严重

streamlit学习笔记三-----layout

streamlit的页面能不能像写html一样的进行页面布局呢?不会css的程序员咋整呢? 有以下方法

一. 自动左右排版

我们在streamlit的演示时,streamlit hello就能看到。己经是左右分两列的布局了。这个不用做专门布局,只要在代码中加入sidebar就行。比如要把一个markdown写入左侧栏只要
把st.markdown(xxx)改为st.sidebar.markdown(xxx)就行。

二. streamlit代码形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
""" 
## 一 streamlit.beta_container()
通过with st.beta_container():,可以Book一个组件模块
将一个不可见的容器插入到你的应用程序中,可以用来保存多个元素。
"""

st.markdown(" - with写法 ")
with st.beta_container():
st.write("with写法,此句放在这个没有命名的容器中,注意通过缩进来表示范围")
# You can call any Streamlit command, including custom components:
st.bar_chart(np.random.randn(50, 3))

st.write("此句放在没有命名的容器外")

st.markdown(" - 常规写法 ")
container_one = st.beta_container()
container_one.write(" 此句写在一个名叫container_one的容器内 ")
st.write(" 没有加容器前缀,所以就只写在容器外了 ")

st.markdown(" - 在另外的地方给一个容器内插一句话 ")
container_one.write("要想在另外的地方给容器内插一句话,容器必须命名,当然这个不符合程序规则,程序结构一塌糊涂 ")

st.markdown(" --- ")
#-------------------------------------------------------------------------------------------------------------
"""
## 二 分列展示
streamlit.beta_columns(spec)

以并排列的形式插入容器。插入多个并排放置的多元素容器,并返回容器对象列表。

要向返回的容器添加元素,可以使用“with”表示法(首选),或者直接调用返回对象的方法。

"""
st.subheader(" 请参见下面的例子。")

col1, col2, col3 = st.beta_columns(3)

with col1:
st.header("猫头")
st.image("/home/frankli/Pictures/cat.jpg", use_column_width=True)

with col2:
st.header("侧滑手机")
st.image("/home/frankli/Pictures/cehua3.jpeg", use_column_width=True)

with col3:
st.header("金色庄园")
st.image("/home/frankli/Pictures/金色庄园.jpg", use_column_width=True)

st.markdown(" --- ")
#-------------------------------------------------------------------------------------------------------------
"""
## 三 按照比例分列展示
"""

col1, col2 = st.beta_columns([3, 1])
data = np.random.randn(10, 1)

col1.subheader(" 宽列展示图表 ")
col1.line_chart(data)

col2.subheader(" 窄列展示数据 ")
col2.write(data)

st.markdown(" --- ")
#-------------------------------------------------------------------------------------------------------------
"""
## 4 折叠/展开
streamlit.beta_expander(label=None, expanded=False)
"""


with st.beta_expander("See explanation"):
st.write("""
在这里进行折叠与展开。
""")
st.line_chart({"data": [1, 5, 2, 6, 2, 1]})