-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
11512 lines (11362 loc) · 627 KB
/
search.xml
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Hexo Hello World</title>
<url>/2019/05/01/hello_world/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="https://github.com/adam-p/markdown-here/wiki/Markdown-Here-Cheatsheet">Markdown</a> 使用<a href="https://github.com/younghz/Markdown">Markdown 基本语法</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。</p>
<h1 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h1><hr>
<h3 id="hexo-快速、简洁且高效的博客框架"><a href="#hexo-快速、简洁且高效的博客框架" class="headerlink" title="hexo 快速、简洁且高效的博客框架"></a><a href="https://hexo.io/zh-cn/">hexo 快速、简洁且高效的博客框架</a></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">npm install hexo-cli -g</span><br><span class="line">hexo init blog</span><br><span class="line">cd blog</span><br><span class="line">npm install</span><br><span class="line">hexo server</span><br></pre></td></tr></table></figure>
<h3 id="init"><a href="#init" class="headerlink" title="init"></a>init</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo init [folder]</span></span><br></pre></td></tr></table></figure>
<p>新建一个网站。如果没有设置 <code>folder</code> ,Hexo 默认在目前的文件夹建立网站。</p>
<span id="more"></span>
<p>本命令相当于执行了以下几步:</p>
<ol>
<li>Git clone <a href="https://github.com/hexojs/hexo-starter">hexo-starter</a> 和 <a href="https://github.com/hexojs/hexo-theme-landscape">hexo-theme-landscape</a> 主题到当前目录或指定目录。</li>
<li>使用 <a href="https://classic.yarnpkg.com/lang/en/">Yarn 1</a>、<a href="https://pnpm.io/zh/">pnpm</a> 或 <a href="https://docs.npmjs.com/cli/install">npm</a> 包管理器下载依赖(如有已安装多个,则列在前面的优先)。npm 默认随 <a href="https://hexo.io/zh-cn/docs/index.html#%E5%AE%89%E8%A3%85-Node-js">Node.js</a> 安装。</li>
</ol>
<h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo new post <span class="string">"PostName"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo server</span><br><span class="line"><span class="comment"># 该命令可以简写为</span></span><br><span class="line">$ hexo s</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo generate</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">该命令可以简写为</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo g</span></span><br></pre></td></tr></table></figure>
<p>生成静态文件。</p>
<table>
<thead>
<tr>
<th>选项</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td><code>-d</code>, <code>--deploy</code></td>
<td>文件生成后立即部署网站</td>
</tr>
<tr>
<td><code>-w</code>, <code>--watch</code></td>
<td>监视文件变动</td>
</tr>
<tr>
<td><code>-b</code>, <code>--bail</code></td>
<td>生成过程中如果发生任何未处理的异常则抛出异常</td>
</tr>
<tr>
<td><code>-f</code>, <code>--force</code></td>
<td>强制重新生成文件 <br>Hexo 引入了差分机制,如果 <code>public</code> 目录存在,那么 <code>hexo g</code> 只会重新生成改动的文件。 <br>使用该参数的效果接近 <code>hexo clean && hexo generate</code></td>
</tr>
<tr>
<td><code>-c</code>, <code>--concurrency</code></td>
<td>最大同时生成文件的数量,默认无限制</td>
</tr>
</tbody></table>
<p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo deploy</span><br><span class="line"><span class="comment"># 该命令可以简写为</span></span><br><span class="line">$ hexo d</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>
<h3 id="version"><a href="#version" class="headerlink" title="version"></a>version</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">hexo version</span></span><br></pre></td></tr></table></figure>
<p>显示 Hexo 版本。</p>
<h1 id="Plugins"><a href="#Plugins" class="headerlink" title="Plugins"></a>Plugins</h1><hr>
<ol>
<li><a href="https://github.com/maxchang3/hexo-markmap">hexo思维导图:hexo-markmap</a></li>
<li><a href="https://github.com/kuole-o/hexo-tag-map?tab=readme-ov-file">Hexo 文章插入交互式地图:hexo-tag-map</a></li>
</ol>
<link rel="stylesheet" href="//unpkg.com/hexo-tag-map/lib/[email protected]"><script data-pjax src="//unpkg.com/hexo-tag-map/lib/[email protected]"></script><script data-pjax src="//unpkg.com/hexo-tag-map/lib/[email protected]"></script><div class="map-box" style="margin: 0.8rem 0 1.6rem 0;"><div id="gaodeMap-119.296623-26.081958" style="max-width:100%; height:360px;display: block;margin:0 auto;z-index:1;border-radius: 5px;"></div></div><script type="text/javascript">var normalm=L.tileLayer.chinaProvider('GaoDe.Normal.Map',{maxZoom:20,minZoom:1,attribution:'高德地图'});var imgm=L.tileLayer.chinaProvider('GaoDe.Satellite.Map',{maxZoom:20,minZoom:1,attribution:'高德地图'});var imga=L.tileLayer.chinaProvider('GaoDe.Satellite.Annotion',{maxZoom:20,minZoom:1,attribution:'高德地图'});var normal=L.layerGroup([normalm]),image=L.layerGroup([imgm,imga]);var baseLayers={"高德地图":normal,"高德卫星地图":imgm,"高德卫星标注":image};var mymap=L.map('gaodeMap-119.296623-26.081958',{center:[26.081958,119.296623],zoom:16,layers:[normal],zoomControl:false});L.control.layers(baseLayers,null).addTo(mymap);L.control.zoom({zoomInTitle:'放大',zoomOutTitle:'缩小'}).addTo(mymap);var marker = L.marker(['26.081958','119.296623']).addTo(mymap);marker.bindPopup("这里是福州三坊七巷,three lanes and seven alleys").openPopup();</script>
<p><a href="https://lbs.amap.com/tools/picker">高德地图坐标拾取系统</a></p>
<table>
<thead>
<tr>
<th align="right">地图名</th>
<th align="right">标签值<必填></th>
<th align="right">经度(-180~180)</th>
<th align="right">纬度(-90~90)</th>
<th align="right">文本</th>
<th align="right">缩放等级(默认14)</th>
</tr>
</thead>
<tbody><tr>
<td align="right">混合地图</td>
<td align="right">map</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值3~18</td>
</tr>
<tr>
<td align="right">谷歌地图</td>
<td align="right">googleMap</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值1~20</td>
</tr>
<tr>
<td align="right">高德地图</td>
<td align="right">gaodeMap</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值3~18</td>
</tr>
<tr>
<td align="right">百度地图</td>
<td align="right">baiduMap</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值4~18</td>
</tr>
<tr>
<td align="right">Geoq地图</td>
<td align="right">geoqMap</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值1~18</td>
</tr>
<tr>
<td align="right">openstreet地图</td>
<td align="right">openstreetMap</td>
<td align="right">坐标经度</td>
<td align="right">坐标纬度</td>
<td align="right">文本</td>
<td align="right">取值1~18</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="right">地图名</th>
<th align="right">宽(默认100%) / 高(默认360px)</th>
<th align="right">默认图层(默认1)</th>
</tr>
</thead>
<tbody><tr>
<td align="right">混合地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">取值1~7</td>
</tr>
<tr>
<td align="right">谷歌地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">取值1~3</td>
</tr>
<tr>
<td align="right">高德地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">取值1~3</td>
</tr>
<tr>
<td align="right">百度地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">取值1~2</td>
</tr>
<tr>
<td align="right">Geoq地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">取值1~5</td>
</tr>
<tr>
<td align="right">openstreet地图</td>
<td align="right">百分数或具体值(100%或360px)</td>
<td align="right">不支持此参数</td>
</tr>
</tbody></table>
<ol>
<li>参数之间,用<strong>英文逗号</strong>相隔</li>
<li>参数必须按上述事例顺序输入,不得为空</li>
<li><strong>同一个页面,同一组经纬度值,只能插入一个相同标签值的地图</strong>(若有需要,可以将第二个地图上,经度或纬度末尾删除一两个数)</li>
<li>参数取值必须在上述范围内</li>
<li>默认图层:即地图叠加层的值,默认常规地图还是卫星地图,可按地图显示顺序取值</li>
<li><strong>缩放等级,数字越大,地图比例尺越小,显示的越精细</strong></li>
<li>除<strong>标签值</strong>外,其他参数选填,但 <strong>每个参数的左边的参数必填</strong></li>
<li>谷歌地图需要外网才能加载查看</li>
</ol>
<h1 id="Notes"><a href="#Notes" class="headerlink" title="Notes"></a>Notes</h1><hr>
<h3 id="本地图片的调用"><a href="#本地图片的调用" class="headerlink" title="本地图片的调用"></a>本地图片的调用</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">my version</span></span><br><span class="line">hexo: 7.2.0</span><br><span class="line">hexo-cli: 4.3.2</span><br></pre></td></tr></table></figure>
<ol>
<li><p>手动新建<br>首先是在 _posts 文件夹下建立一个<code>本地图片的调用.md</code>,再建立一个同名的文件夹 <code>本地图片的调用</code>。</p>
</li>
<li><p>hexo代码新建<br>使用<code>hexo new post 本地图片的调用</code>,可以生成md文件的同时生成一个同名文件夹用于存储网页资源。</p>
</li>
</ol>
<p>这篇文章要引用的图片就放在该文件夹下。比如我就在该目录下放一个图片<code>1.png</code>。</p>
<p><img src="/2019/05/01/hello_world/1.png"></p>
<p>然后在博文 MarkDown 文件里引用该图片:</p>
<figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">![<span class="string">这里是图片注释</span>](<span class="link">../images/2019_05_01_hello_world/1.png</span>)</span><br></pre></td></tr></table></figure>
<p><strong>为什么引用的时候不用加文件夹的路径呢?</strong></p>
<p>这是因为 hexo 在渲染的时候,会把<code>本地图片的调用.md</code> 渲染为<code>public</code>下的 <code>本地图片的调用.html</code>网页文件,而把对应文件夹下的静态资源,比如图片 <code>1.png</code>也拷贝到<code>public</code>下!</p>
<p>需要注意的是,在<code>hexo/source/_posts</code>目录下的图片文件名不能重复。</p>
<h3 id="skip-render"><a href="#skip-render" class="headerlink" title="skip render"></a>skip render</h3><p>修改hexo根目录下_config.yml文件,</p>
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">skip_render:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">'_posts/templates/**'</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">'_posts/draft/**'</span></span><br></pre></td></tr></table></figure>
<p>目录结构:<br><code>- hexo/source/_posts/templates/</code> 保存post模版,供Obsidian快速开始Post编写。<br><code>- hexo/source/_posts/draft/</code> 保存未编辑完成,或不想共享的文章内容。</p>
<p>设置跳过渲染之后,最好使用<code>hexo clean</code>清除以前的编译结果,保证配置生效。再使用<code>hexo g</code>查看。</p>
<h3 id="自动generate"><a href="#自动generate" class="headerlink" title="自动generate"></a>自动generate</h3><p>定时or设置条件运行命令<code>docker exec -it hexo bash -c "hexo clean && hexo g"</code>来自动编译。</p>
<p><strong>踩坑:</strong> 直接在群晖的<code>控制面板</code> - <code>任务计划</code>中添加自定义脚本<code>docker exec -it hexo bash -c "hexo clean && hexo g"</code>会报错<code>the input device is not a TTY</code>.</p>
<p>tty一词源于Teletypes,或teletypewriters。这个的意思是说后台linux执行的时候没有终端设备。我们一般执行docker里的命令时候都喜欢加上-it 这个参数,这里的-t 就是表示伪tty。所以,如果我们docker执行后台运行的任务或者程序直接去除 -t 这个参数就不会出现这个报错了。</p>
<p><strong>所以要用 <code>docker exec hexo bash -c "hexo clean && hexo g"</code></strong></p>
<p><strong>待改进:</strong> 设置了每天generate一次。如果设置成有变动就generate就更好了,暂时没想到办法。</p>
<h3 id="视频嵌入"><a href="#视频嵌入" class="headerlink" title="视频嵌入"></a>视频嵌入</h3><p>现在视频基本上都会分享到各大平台,所以暂时主要以嵌入网络视频展示。<br>研究了几款插件,基本上都是年久失修,使用不易,最终还是选择了<code>iframe</code>嵌入。</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">%%bilibili视频嵌入%%</span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">"position: relative; width: 100%; height: 0; padding-bottom: 75%;"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">iframe</span> <span class="attr">src</span>=<span class="string">"//player.bilibili.com/player.html?aid=244387247&cid=229573649&page=1"</span> <span class="attr">scrolling</span>=<span class="string">"no"</span> <span class="attr">border</span>=<span class="string">"0"</span> <span class="attr">frameborder</span>=<span class="string">"no"</span> <span class="attr">framespacing</span>=<span class="string">"0"</span> <span class="attr">allowfullscreen</span>=<span class="string">"true"</span> <span class="attr">style</span>=<span class="string">"position: absolute; width: 100%; height: 100%; Left: 0; top: 0;"</span> ></span></span><br><span class="line"><span class="tag"></<span class="name">iframe</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span> </span><br></pre></td></tr></table></figure>
<p><a href="https://github.com/stephenmkbrady/hexo-tag-html5">hexo-tag-html5video</a></p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">npm install --save hexo-tag-html5video</span><br></pre></td></tr></table></figure>
<figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">{% html5video '100%' '250px' 'video/mp4' %} </span><br><span class="line">{% asset<span class="emphasis">_path <视频路径> %} </span></span><br><span class="line"><span class="emphasis">{% endhtml5video %}</span></span><br></pre></td></tr></table></figure>
<h3 id="菜单导航配置"><a href="#菜单导航配置" class="headerlink" title="菜单导航配置"></a>菜单导航配置</h3><p>配置基本菜单导航的名称、路径url和图标icon.</p>
<ol>
<li>菜单导航名称可以是中文也可以是英文(如:<code>Index</code> 或 <code>主页</code>)</li>
<li><code>External</code> 表示是否在新标签页打开连接</li>
<li>导航地址可以是站内地址也可以是外网地址</li>
</ol>
<h3 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h3><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">hexo</span><br><span class="line"><span class="bullet"> -</span> node<span class="emphasis">_modules</span></span><br><span class="line"><span class="emphasis"> - scaffolds # 模板文件夹</span></span><br><span class="line"><span class="emphasis"> - draft.md # 草稿模板文件</span></span><br><span class="line"><span class="emphasis"> - page.md # 页面模板文件</span></span><br><span class="line"><span class="emphasis"> - post.md # 文章模板文件</span></span><br><span class="line"><span class="emphasis"> - source # 资源文件夹</span></span><br><span class="line"><span class="emphasis"> - _</span>drafts # 草稿文件夹</span><br><span class="line"><span class="bullet"> -</span> <span class="emphasis">_posts # post文件夹</span></span><br><span class="line"><span class="emphasis"> - images #图片文件夹</span></span><br><span class="line"><span class="emphasis"> - themes # 主题文件夹</span></span><br><span class="line"><span class="emphasis"> - ayer # 主题文件夹</span></span><br><span class="line"><span class="emphasis"> - _</span>config.yml # 主题配置文件</span><br><span class="line"><span class="bullet"> -</span> languages # 语言文件夹</span><br><span class="line"><span class="bullet"> -</span> layout # 布局文件夹</span><br><span class="line"><span class="bullet"> -</span> scripts # 脚本文件夹</span><br><span class="line"><span class="bullet"> -</span> source # 资源文件夹</span><br><span class="line"><span class="bullet"> -</span> css # 样式文件夹</span><br><span class="line"><span class="bullet"> -</span> fonts # 字体文件夹</span><br><span class="line"><span class="bullet"> -</span> images # 图片文件夹</span><br><span class="line"><span class="bullet"> -</span> js # 脚本文件夹</span><br><span class="line"><span class="bullet"> -</span> <span class="emphasis">_config.yml # 配置文件</span></span><br></pre></td></tr></table></figure>
<h3 id="本地图片的调用-1"><a href="#本地图片的调用-1" class="headerlink" title="本地图片的调用"></a>本地图片的调用</h3><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">![<span class="string">这里是图片注释</span>](<span class="link">../images/2019_05_01_hello_world/1.png</span>)</span><br></pre></td></tr></table></figure>
<h3 id="DIY-hexo-new-post"><a href="#DIY-hexo-new-post" class="headerlink" title="DIY hexo new post"></a>DIY hexo new post</h3><p>修改hexo根目录下_config.yml文件,</p>
<ol>
<li>为新建post自动加上当前日期,避免title重复,造成的一系列问题。</li>
</ol>
<figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Writing</span></span><br><span class="line"><span class="comment"># new_post_name: title.md # default setting</span></span><br><span class="line"><span class="attr">new_post_name:</span> <span class="string">:year_:month_:day_:title.md</span> </span><br><span class="line"><span class="comment"># new posts name as year_month_day_postname</span></span><br><span class="line"><span class="attr">default_layout:</span> <span class="string">post</span></span><br><span class="line"><span class="attr">titlecase:</span> <span class="literal">false</span> <span class="comment"># Transform title into titlecase</span></span><br><span class="line"><span class="attr">external_link:</span></span><br><span class="line"><span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># Open external links in new tab</span></span><br><span class="line"><span class="attr">field:</span> <span class="string">site</span> <span class="comment"># Apply to the whole site</span></span><br><span class="line"><span class="attr">exclude:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">filename_case:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">render_drafts:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure>
<ol start="2">
<li>为了使_post文件夹尽可能的精简,便于网盘同步,只保留md文件,图片等资源放在<code>source</code>目录下<code>images</code>文件夹内。</li>
</ol>
<figure class="highlight sqf"><table><tr><td class="code"><pre><span class="line">post_asset_folder: <span class="literal">false</span> </span><br><span class="line"># 改成<span class="literal">true</span>,则在<span class="variable">_post</span>新建下新建md文件的同时新建一个同名的文件夹用于存储当前页面的一些资源。</span><br></pre></td></tr></table></figure>
<h3 id="引用文章"><a href="#引用文章" class="headerlink" title="引用文章"></a><a href="https://hexo.io/zh-cn/docs/tag-plugins#%E5%BC%95%E7%94%A8%E6%96%87%E7%AB%A0">引用文章</a></h3><p>引用其他文章的链接。</p>
<figure class="highlight django"><table><tr><td class="code"><pre><span class="line"><span class="template-tag">{% <span class="name">post_path</span> filename %}</span><span class="language-xml"> </span></span><br><span class="line"><span class="language-xml"></span><span class="template-tag">{% <span class="name">post_link</span> filename [title] [escape] %}</span></span><br></pre></td></tr></table></figure>
<p>在使用此标签时可以忽略文章文件所在的路径或者文章的永久链接信息、如语言、日期。</p>
<p>例如,在文章中使用 <code>{% post_link how-to-bake-a-cake %}</code> 时,只需有一个名为 <code>how-to-bake-a-cake.md</code> 的文章文件即可。即使这个文件位于站点文件夹的 <code>source/posts/2015-02-my-family-holiday</code> 目录下、或者文章的永久链接是 <code>2018/en/how-to-bake-a-cake</code>,都没有影响。</p>
<p>默认链接文字是文章的标题,你也可以自定义要显示的文本。</p>
<p>默认对文章的标题和自定义标题里的特殊字符进行转义。可以使用 <code>escape</code> 选项,禁止对特殊字符进行转义。</p>
<p>例如:</p>
<p><strong>链接使用文章的标题</strong></p>
<p><code>{% post_link hexo-3-8-released %}</code></p>
<p><strong>链接使用自定义文字</strong></p>
<p><code>{% post_link hexo-3-8-released '通往文章的链接' %}</code></p>
<p><strong>对标题的特殊字符进行转义</strong></p>
<figure class="highlight crmsh"><table><tr><td class="code"><pre><span class="line">{% post_link hexo-<span class="number">4</span>-released 'How to use <span class="tag"><b></span> <span class="keyword">tag</span> <span class="title">in</span> title' %}</span><br></pre></td></tr></table></figure>
<h3 id="动态自定义附件文件夹名称"><a href="#动态自定义附件文件夹名称" class="headerlink" title="动态自定义附件文件夹名称"></a>动态自定义附件文件夹名称</h3><p>插件 <strong>Custom Attachment Location</strong> ,安装后进行附件文件夹的设置:</p>
<figure class="highlight xl"><table><tr><td class="code"><pre><span class="line">C<span class="function"><span class="title">ustom</span> Attachment Location --></span> L<span class="function"><span class="title">ocation</span> <span class="keyword">for</span> New Attachments --></span> ./${filename}.assets (这样设置是为了与 Typora 兼容,正常显示 Typora 中创建的笔记的图片附件)</span><br></pre></td></tr></table></figure>
<h1 id="post在首页全文展示问题"><a href="#post在首页全文展示问题" class="headerlink" title="post在首页全文展示问题"></a>post在首页全文展示问题</h1><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"># 主题config文件 ~/hexo/themes/ayer/_config.yml</span><br><span class="line"># 文章太长,截断按钮文字(在需要截断的行增加此标记:<span class="comment"><!--more--></span>)</span><br></pre></td></tr></table></figure>
<p>More info:<br><a href="https://post.smzdm.com/p/agqol9zm/">晨聊 篇十七:markdown也变脸,obsidian + hexo 在群晖NAS上的双剑合璧</a></p>
]]></content>
<categories>
<category>技术</category>
<category>博客</category>
<category>hexo</category>
</categories>
<tags>
<tag>markdown</tag>
<tag>hexo</tag>
<tag>笔记</tag>
</tags>
</entry>
<entry>
<title>苹果全平台无缝同步群晖Obsidian库</title>
<url>/2019/05/24/Apple%E5%85%A8%E5%B9%B3%E5%8F%B0%E6%97%A0%E7%BC%9D%E5%90%8C%E6%AD%A5%E7%BE%A4%E6%99%96Obsidian%E5%BA%93/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>前提介绍:</strong></p>
<blockquote>
<p><a href="https://obsidian.md/">Obsidian</a>是一款基于Markdown的笔记软件,以其强大的链接和标签功能、本地化存储及丰富的插件生态,为用户提供高效的知识管理和创作体验。 </p>
</blockquote>
<blockquote>
<p><a href="https://www.synology.cn/zh-cn">群晖NAS</a>是一种基于网络连接的存储设备,它提供集中管理和共享文件的平台,支持多种功能,如数据备份、多媒体服务器等,方便用户随时随地访问和管理数据。</p>
</blockquote>
<h2 id="本文的目的"><a href="#本文的目的" class="headerlink" title="本文的目的"></a>本文的目的</h2><p><a href="https://obsidian.md/">Obsidian</a>作为一款优秀的markdown笔记软件,非常适合搭配hexo撰写blog。</p>
<p>通过macOS上群晖Drive将hexo的post目录同步到iCloud,实现macOS和群晖drive的同步,然后通过iCloud在不同苹果设备上同步hexo的post目录,实现任意苹果设备撰写blog都可以在macOS通过群晖drive将新blog内容同步至群晖,再由群晖将内容自动布置到GitHub,实现blog网站的自动更新。</p>
<span id="more"></span>
<div class="markmap-container" style="height:400px">
<svg data="{"t":"heading","d":1,"p":{"lines":[1,2]},"v":"Blog内容同步与自动更新流程","c":[{"t":"heading","d":2,"p":{"lines":[3,4]},"v":"macOS","c":[{"t":"heading","d":3,"p":{"lines":[4,5]},"v":"群晖Drive","c":[{"t":"list_item","d":5,"p":{"lines":[5,6]},"v":"同步Hexo的post目录到iCloud"}]}]},{"t":"heading","d":2,"p":{"lines":[7,8]},"v":"iCloud","c":[{"t":"list_item","d":4,"p":{"lines":[8,9]},"v":"同步Hexo的post目录"},{"t":"list_item","d":4,"p":{"lines":[9,10]},"v":"跨苹果设备同步"}]},{"t":"heading","d":2,"p":{"lines":[11,12]},"v":"苹果设备","c":[{"t":"heading","d":3,"p":{"lines":[12,13]},"v":"任意设备","c":[{"t":"list_item","d":5,"p":{"lines":[13,14]},"v":"撰写blog"},{"t":"list_item","d":5,"p":{"lines":[14,15]},"v":"通过iCloud同步到macOS"}]}]},{"t":"heading","d":2,"p":{"lines":[16,17]},"v":"macOS(继续)","c":[{"t":"heading","d":3,"p":{"lines":[17,18]},"v":"群晖Drive(继续)","c":[{"t":"list_item","d":5,"p":{"lines":[18,19]},"v":"将新blog内容同步至群晖"}]}]},{"t":"heading","d":2,"p":{"lines":[20,21]},"v":"群晖","c":[{"t":"list_item","d":4,"p":{"lines":[21,22]},"v":"将内容自动布置到GitHub"}]},{"t":"heading","d":2,"p":{"lines":[23,24]},"v":"GitHub","c":[{"t":"list_item","d":4,"p":{"lines":[24,25]},"v":"自动更新blog网站"}]}]}"></svg>
</div>
<h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><blockquote>
<p>iPadOS和iOS端Obsidian只能识别打开iCloud Drive中Obsidian目录下的库,但macOS端的群晖Drive同步目录找不到iCloud目录,也就无法从iCloud同步至群晖。</p>
</blockquote>
<h2 id="解决步骤"><a href="#解决步骤" class="headerlink" title="解决步骤"></a>解决步骤</h2><h3 id="第一步"><a href="#第一步" class="headerlink" title="第一步"></a>第一步</h3><p>全部苹果设备开启 iCloud 同步,在 iOS/iPadOS 下打开 obsidian 新建库,会自动生成一个<code>welcome.md</code>文件。</p>
<h3 id="第二步"><a href="#第二步" class="headerlink" title="第二步"></a>第二步</h3><p>打开 macOS 访达,左侧打开 iCloud 云盘,点 obsidian 图标文件下载到本地管理(云箭头表示还在云上)。</p>
<h3 id="第三步"><a href="#第三步" class="headerlink" title="第三步"></a>第三步</h3><p>显示 Mac 隐藏文件的两种方法:</p>
<ol>
<li>mac 终端中输入入命令:<code>defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder</code> 。</li>
<li>快捷键组合:<code>⌘+⇧+。</code></li>
</ol>
<p>隐藏文件显示后,找到自己用户名下的资源库,在上方菜单栏<code>显示</code>-<code>查看显示选项</code>(<code>⌘+J</code>)中勾选<code>显示资源库文件夹</code>,这样就可以在群晖Drive同步软件中定位到 iCloud 内的文件夹。</p>
<h3 id="第四步"><a href="#第四步" class="headerlink" title="第四步"></a>第四步</h3><p>macOS 打开群晖的配套同步软件<code>群晖 Drive Client</code>设置,创建选定<code>mac</code>用户名下<code>library</code>中的<code>moblie documents</code>文件,翻到iCloud前缀的obsidian文件夹,同步之前 iOS 中新建的库即可。</p>
<h3 id="第五步"><a href="#第五步" class="headerlink" title="第五步"></a>第五步</h3><p>macOS 中iCloud下 Obsidian 打开库文件夹,在网络 nas 中即可找到此 iOS/iPadOS 新建的库。</p>
<p>完成之后,关闭显示 Mac 隐藏文件:<code>defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder</code></p>
<h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><p>实测多设备下修改输入,几乎都是秒刷到账,唯一要担心的是删的太快,如果在一处误删掉某内容,很快会被同步覆盖。不过群晖drive 中可以看同步日志,应问题不大。</p>
<p>目前还没有遇上同步问题,仅提供解决方案,数据无价,请自行斟酌\(^ ^)/</p>
]]></content>
<categories>
<category>技术</category>
<category>博客</category>
<category>hexo</category>
</categories>
<tags>
<tag>markdown</tag>
<tag>hexo</tag>
<tag>Obsidian</tag>
</tags>
</entry>
<entry>
<title>群晖Git部署Hexo</title>
<url>/2019/05/06/Git_Hexo/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="一、前期准备"><a href="#一、前期准备" class="headerlink" title="一、前期准备"></a>一、前期准备</h2><h3 id="1-1-注册-账号-Gitee-GitHub"><a href="#1-1-注册-账号-Gitee-GitHub" class="headerlink" title="1.1 注册 账号 Gitee/GitHub"></a>1.1 注册 账号 Gitee/GitHub</h3><p>注册一个属于自己的 Github 或 Gitee 账号,</p>
<p>Gitee在国内访问速度更快,但Gitee需要上传身份证照片若干张进行实名认证,懒得掏身份证,pass掉。</p>
<span id="more"></span>
<p><img src="/2019/05/06/Git_Hexo/%E5%AE%9E%E5%90%8D%E9%AA%8C%E8%AF%81.png" alt="实名认证"></p>
<p>本文采用 Github 演示。 </p>
<h3 id="1-2-安装-Git"><a href="#1-2-安装-Git" class="headerlink" title="1.2 安装 Git"></a>1.2 安装 Git</h3><p>选择对应的系统平台,下载后,傻瓜式安装即可。 安装完成后,打开运行 –> 输入命令,回车打开命令行窗口 输入以下Git指令</p>
<figure class="highlight ada"><table><tr><td class="code"><pre><span class="line">git <span class="comment">--version</span></span><br></pre></td></tr></table></figure>
<p>出现版本号,即代表 git 安装成功</p>
<h3 id="1-3-Git-和-Github-建立联系"><a href="#1-3-Git-和-Github-建立联系" class="headerlink" title="1.3 Git 和 Github 建立联系"></a>1.3 Git 和 Github 建立联系</h3><p>任意目录下,打开 git bash 命令行,输入以下命令生成公钥:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t rsa -C 邮箱</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">为了管理多个密钥,你可以在生成密钥时为每个密钥指定不同的文件名</span></span><br><span class="line">ssh-keygen -t rsa -C "[email protected]" -f ~/.ssh/id_rsa_example_com</span><br></pre></td></tr></table></figure>
<p>回车出现 (y/n), 输入 y , 连续点击回车,即可生成。</p>
<p>在<code>~/.ssh</code> 目录,找到 <code>id_rsa_example_com.pub</code> 文件,<code>cat ~/.ssh/id_rsa_example_com.pub</code>获取公钥。</p>
<p>到GitHub找到 <code>设置</code> 并打开,找到左侧栏 <code>Access</code>下找到<code>SSH and GPG keys</code>,点击<code>New SSH keys</code>,添加 <code>Title</code> 和 <code>Key</code></p>
<p>云端仓库创建完成的 gitee,更改远程仓库 URL 为 SSH</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chmod 600 ~/.ssh/id_rsa_*</span><br><span class="line">chown your_username:users ~/.ssh/id_rsa_*</span><br></pre></td></tr></table></figure>
<p><strong>输入以下指令,进行全局配置:</strong></p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git config --global user.name "你的用户名"</span><br><span class="line">git config --global user.email "你的邮箱"</span><br></pre></td></tr></table></figure>
<p>查看config文件是否存在,不存在新建<code>touch config</code>,<br> config文件内容如下:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">Host github.com</span><br><span class="line"> User git</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_example_com</span><br><span class="line"> PreferredAuthentications publickey</span><br></pre></td></tr></table></figure>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">测试连接</span></span><br><span class="line">ssh -T [email protected]</span><br></pre></td></tr></table></figure>
<p>将纳入版本库的文件,提交到 gitee 远程仓库:</p>
<figure class="highlight routeros"><table><tr><td class="code"><pre><span class="line">git <span class="built_in">add</span> .</span><br><span class="line">git commit -m <span class="string">'first commit'</span></span><br><span class="line">git remote <span class="built_in">add</span> origin 你的仓库地址</span><br><span class="line">git push -u origin master</span><br></pre></td></tr></table></figure>
<p>此时,提交完成,打开浏览器,输入你的仓库地址,刷新即可看到文件。</p>
<ol>
<li><code>hexo clean</code>: 这个命令用于清理缓存文件和已生成的静态文件。它删除了<code>public</code>文件夹中的内容以及<code>.hexo</code>文件夹中的缓存文件。这是在部署博客之前的一个好习惯,因为它确保了生成的静态文件是最新的,避免了由于旧的缓存或文件导致的潜在问题。</li>
<li><code>hexo deploy</code>: 这个命令用于将博客部署到服务器上。在执行这个命令之前,Hexo会生成所有的静态文件,并根据<code>_config.yml</code>文件中的<code>deploy</code>部分配置将它们上传到指定的服务器。这通常涉及到将文件推送到GitHub Pages、FTP服务器或其他静态网站托管服务。</li>
</ol>
<figure class="highlight 1c"><table><tr><td class="code"><pre><span class="line">$ hexo clean <span class="meta">&& hexo deploy</span></span><br></pre></td></tr></table></figure>
<p>在NAS上定时执行<code>hexo clean && hexo deploy</code>,实现自动更新内容。</p>
]]></content>
<categories>
<category>技术</category>
<category>博客</category>
<category>hexo</category>
</categories>
<tags>
<tag>hexo</tag>
<tag>笔记</tag>
<tag>技术</tag>
<tag>ssh</tag>
<tag>GitHub</tag>
</tags>
</entry>
<entry>
<title>为部署在Github上的Hexo博客配置域名</title>
<url>/2019/05/25/%E4%B8%BA%E9%83%A8%E7%BD%B2%E5%9C%A8Github%E4%B8%8A%E7%9A%84Hexo%E5%8D%9A%E5%AE%A2%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h4 id="一、Hexo项目部署到Github"><a href="#一、Hexo项目部署到Github" class="headerlink" title="一、Hexo项目部署到Github"></a>一、<a href="https://so.csdn.net/so/search?q=Hexo&spm=1001.2101.3001.7020">Hexo</a>项目部署到Github</h4><p>首先要确保你的hexo项目已经部署到github上,如果不知道hexo项目如何部署到github上,请看另一篇文章↓</p>
<a href="/2019/05/06/Git_Hexo/" title="群晖Git部署Hexo">群晖Git部署Hexo</a>
<p>如果你的<strong>hexo项目已经搭建好</strong>,可直接跳转到<strong>第五步,看部署到Github</strong>的步骤。</p>
<h4 id="二、解析域名到GitHub-Pages"><a href="#二、解析域名到GitHub-Pages" class="headerlink" title="二、解析域名到GitHub Pages"></a>二、解析域名到GitHub Pages</h4><h5 id="1:首先购买或注册一个域名"><a href="#1:首先购买或注册一个域名" class="headerlink" title="1:首先购买或注册一个域名"></a>1:首先购买或注册一个域名</h5><p>购买域名的渠道有很多,可以国内,也可以国外,本人是在国外的GoDaddy平台上买的(好处是管理比较方便,不用备案啥的了…),问题多的话我再写一篇具体申请的blog。</p>
<h5 id="2:解析域名到Github"><a href="#2:解析域名到Github" class="headerlink" title="2:解析域名到Github"></a>2:解析域名到Github</h5><p>首先登录你域名注册商的控制面板,这里以GoDaddy为例</p>
<span id="more"></span>
<p>打开<strong>控制面板</strong></p>
<p><img src="/2019/05/25/%E4%B8%BA%E9%83%A8%E7%BD%B2%E5%9C%A8Github%E4%B8%8A%E7%9A%84Hexo%E5%8D%9A%E5%AE%A2%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D/image-20240428210042566.png"></p>
<p>接着<strong>打开DNS配置页面</strong></p>
<p><img src="/2019/05/25/%E4%B8%BA%E9%83%A8%E7%BD%B2%E5%9C%A8Github%E4%B8%8A%E7%9A%84Hexo%E5%8D%9A%E5%AE%A2%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D/image-20240428210031684.png"></p>
<p>接着<strong>添加以下几条解析</strong></p>
<p><img src="/2019/05/25/%E4%B8%BA%E9%83%A8%E7%BD%B2%E5%9C%A8Github%E4%B8%8A%E7%9A%84Hexo%E5%8D%9A%E5%AE%A2%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D/image-20240428210020252.png"></p>
<p>上面几条IP地址是从<a href="">Github官网</a>上得来的,具体可以查看这个地址<a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-an-apex-domain">Managing a custom domain for your GitHub Pages site - GitHub Docs</a></p>
<p>至此,域名注册服务商上的github pages域名解析我们就完成了!</p>
<h4 id="三、配置Hexo项目"><a href="#三、配置Hexo项目" class="headerlink" title="三、配置Hexo项目"></a>三、配置Hexo项目</h4><ol>
<li>在你的hexo项目的<strong>source</strong>文件夹根目录里添加一个<strong>CNAME</strong>文件(不带任何后缀的文件),CNAME里面的内容是你的<strong>域名</strong>。</li>
<li>然后打开我们 hexo 项目的配置文件 <strong>_config.yml</strong> ,找到 <strong>url 配置项</strong> ,替换成我们的域名就可以了。</li>
</ol>
<h4 id="四、配置Github-Pages"><a href="#四、配置Github-Pages" class="headerlink" title="四、配置Github Pages"></a>四、配置Github Pages</h4><ol>
<li>打开我们的hexo项目在github上的仓库,进入设置页面</li>
<li>找到<strong>Pages选项</strong>,<code>Custom domain</code> 填上我们的<strong>域名</strong>,勾选上<strong>强制打开HTTPS</strong>。</li>
<li>等DNS检查通过,稍微等一会,就可以用域名打开我们的Hexo部署在Github上的项目啦!</li>
</ol>
<p>原文链接: <a href="https://www.laodengai.com/domain-name-on-github-20240319/">Hexo 项目在 Github 上配置域名 | 老登 AI (laodengai.com)</a></p>
]]></content>
<categories>
<category>技术</category>
<category>博客</category>
<category>hexo</category>
</categories>
<tags>
<tag>markdown</tag>
<tag>hexo</tag>
<tag>插件</tag>
</tags>
</entry>
<entry>
<title>在hexo博客中插入思维导图</title>
<url>/2019/05/24/%E5%9C%A8hexo%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%8F%92%E5%85%A5%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="https://github.com/maxchang3/hexo-markmap">hexo-markmap</a></p>
<p><strong>使用示例</strong></p>
<span id="more"></span>
<figure class="highlight clean"><table><tr><td class="code"><pre><span class="line">{% markmap <span class="number">400</span>px %}</span><br><span class="line"> </span><br><span class="line"># Blog内容同步与自动更新流程 </span><br><span class="line"> </span><br><span class="line">## macOS </span><br><span class="line">### 群晖Drive </span><br><span class="line">- 同步Hexo的post目录到iCloud </span><br><span class="line"> </span><br><span class="line">## iCloud </span><br><span class="line">- 同步Hexo的post目录 </span><br><span class="line">- 跨苹果设备同步 </span><br><span class="line"> </span><br><span class="line">## 苹果设备 </span><br><span class="line">### 任意设备 </span><br><span class="line">- 撰写blog </span><br><span class="line">- 通过iCloud同步到macOS </span><br><span class="line"> </span><br><span class="line">## macOS(继续) </span><br><span class="line">### 群晖Drive(继续) </span><br><span class="line">- 将新blog内容同步至群晖 </span><br><span class="line"> </span><br><span class="line">## 群晖 </span><br><span class="line">- 将内容自动布置到GitHub </span><br><span class="line"> </span><br><span class="line">## GitHub </span><br><span class="line">- 自动更新blog网站</span><br><span class="line">{% endmarkmap %}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>技术</category>
<category>博客</category>
<category>hexo</category>
</categories>
<tags>
<tag>markdown</tag>
<tag>hexo</tag>
<tag>插件</tag>
</tags>
</entry>
<entry>
<title>菜谱</title>
<url>/2022/04/19/%E8%8F%9C%E8%B0%B1/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="空气炸锅鸡排"><a href="#空气炸锅鸡排" class="headerlink" title="空气炸锅鸡排"></a>空气炸锅鸡排</h1><ul>
<li>温度:200度</li>
<li>时间:8分钟 + 4分钟</li>
</ul>
<h1 id="空气炸锅健身食品"><a href="#空气炸锅健身食品" class="headerlink" title="空气炸锅健身食品"></a>空气炸锅健身食品</h1><ul>
<li>鸡胸肉(黑胡椒、13香、橄榄油)</li>
<li>地瓜(切块、橄榄油)</li>
<li>温度:180度</li>
<li>时间:15分钟</li>
</ul>
<span id="more"></span>
<p><a href="https://www.youtube.com/watch?v=D8O7myqk0Bw">健身食品制作视频</a></p>
<h1 id="阳春面调料"><a href="#阳春面调料" class="headerlink" title="阳春面调料"></a>阳春面调料</h1><ul>
<li>生抽、陈醋、盐、香油或猪油、葱花</li>
</ul>
<h1 id="爆炒香辣鱿鱼"><a href="#爆炒香辣鱿鱼" class="headerlink" title="爆炒香辣鱿鱼"></a>爆炒香辣鱿鱼</h1><p>食材:</p>
<ul>
<li>鱿鱼须、葱、姜、洋葱、料酒、豆瓣酱、生抽、老抽、蚝油、白糖、盐、熟芝麻</li>
</ul>
<p>做法:</p>
<ol>
<li>鱿鱼洗净切好备用,冷水下锅,加入姜片、葱段、1勺料酒,焯水捞出备用</li>
<li>锅中油热,倒入洋葱丝,炒出香味,加入1勺豆瓣酱炒出红油,倒入焯好水的鱿鱼须,翻炒上色</li>
<li>加入1勺生抽、半勺老抽、1勺蚝油、适量白糖、少许盐、1勺熟芝麻,翻炒均匀,撒上葱花即可</li>
</ol>
]]></content>
<categories>
<category>生活</category>
<category>菜谱</category>
</categories>
<tags>
<tag>菜谱</tag>
<tag>下酒菜</tag>
</tags>
</entry>
<entry>
<title>SQL学习笔记</title>
<url>/2023/02/27/SQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="/_post/2024_02_28_%E6%8E%92%E5%BA%8F_DENSE_RANK.md">排序_DENSE_RANK</a></p>
<h2 id="IFNULL"><a href="#IFNULL" class="headerlink" title="IFNULL"></a>IFNULL</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># Write your MySQL query statement below</span><br><span class="line"></span><br><span class="line">select e.name, b.bonus</span><br><span class="line"></span><br><span class="line">from Employee e left join Bonus b</span><br><span class="line"></span><br><span class="line">on e.empId = b.empId</span><br><span class="line"></span><br><span class="line">where ifnull(bonus,0)<1000</span><br><span class="line">## ifnul 就把值替换成0)</span><br></pre></td></tr></table></figure>
<span id="more"></span>
<h2 id="SQL-585"><a href="#SQL-585" class="headerlink" title="SQL 585"></a>SQL 585</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016</span><br><span class="line"></span><br><span class="line">FROM Insurance</span><br><span class="line"></span><br><span class="line">WHERE tiv_2015 IN (</span><br><span class="line"></span><br><span class="line">SELECT tiv_2015</span><br><span class="line"></span><br><span class="line">FROM Insurance</span><br><span class="line"></span><br><span class="line">GROUP BY tiv_2015</span><br><span class="line"></span><br><span class="line">HAVING COUNT(*) > 1</span><br><span class="line"></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">AND (lat, lon) NOT IN (</span><br><span class="line"></span><br><span class="line">SELECT lat, lon</span><br><span class="line"></span><br><span class="line">FROM Insurance</span><br><span class="line"></span><br><span class="line">GROUP BY lat, lon</span><br><span class="line"></span><br><span class="line">HAVING COUNT(*) > 1</span><br><span class="line"></span><br><span class="line">)</span><br></pre></td></tr></table></figure>
<h2 id="SQL-610"><a href="#SQL-610" class="headerlink" title="SQL 610"></a>SQL 610</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># Write your MySQL query statement below</span><br><span class="line">select </span><br><span class="line"> *,</span><br><span class="line"> if(x+y>z and x+z>y and y+z>x,'Yes','No') as triangle</span><br><span class="line">from Triangle</span><br></pre></td></tr></table></figure>
<h2 id="SQL1633-ORDER-BY-2-DESC-1"><a href="#SQL1633-ORDER-BY-2-DESC-1" class="headerlink" title="SQL1633 ORDER BY 2 DESC, 1"></a>SQL1633 ORDER BY 2 DESC, 1</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ORDER BY 2 DESC, 1</span><br></pre></td></tr></table></figure>
<p>这一行使用ORDER BY子句对结果进行排序。我们按照第二列(即percentage)的降序进行排序,如果百分比相同,则按照第一列(即contest_id)的升序进行排序。</p>
<h2 id="SQL1179-CASE-WHEN"><a href="#SQL1179-CASE-WHEN" class="headerlink" title="SQL1179 CASE WHEN"></a>SQL1179 CASE WHEN</h2><p>CASE WHEN语句是SQL中用于根据条件进行条件判断和返回不同结果的表达式。它允许你根据满足特定条件的情况,选择不同的结果进行返回。</p>
<p>CASE WHEN语句的基本语法如下:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">CASE</span><br><span class="line"> WHEN condition1 THEN result1</span><br><span class="line"> WHEN condition2 THEN result2</span><br><span class="line"> ...</span><br><span class="line"> ELSE resultN</span><br><span class="line">END</span><br></pre></td></tr></table></figure>
<p>首先,你提供一个或多个WHEN子句,每个子句后面跟着一个条件(condition)和一个对应的结果(result)。当满足某个条件时,相应的结果将被返回。ELSE子句是可选的,用于指定当没有任何条件满足时的默认结果。</p>
<p>让我们通过一个简单的例子来说明CASE WHEN的使用。假设有一个名为”students”的表,其中包含学生的姓名和分数列。如果要将成绩分为优秀、良好和及格三个等级并进行显示,可以使用以下SQL语句:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT name,</span><br><span class="line"> CASE</span><br><span class="line"> WHEN score >= 90 THEN '优秀'</span><br><span class="line"> WHEN score >= 80 THEN '良好'</span><br><span class="line"> WHEN score >= 60 THEN '及格'</span><br><span class="line"> ELSE '不及格'</span><br><span class="line"> END AS grade</span><br><span class="line">FROM students;</span><br></pre></td></tr></table></figure>
<p>在这个例子中,对于每个学生,我们使用CASE WHEN语句根据他们的分数来判断他们的等级。如果分数大于等于90,那么他们被归类为”优秀”;如果分数大于等于80,但小于90,他们被归类为”良好”;如果分数大于等于60,但小于80,他们被归类为”及格”;否则,他们被归类为”不及格”。</p>
<p>通过使用CASE WHEN语句,我们可以根据不同的条件返回不同的结果,从而实现灵活的数据处理和转换。</p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>SQL</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>SQL</tag>
</tags>
</entry>
<entry>
<title>排序_DENSE_RANK</title>
<url>/2023/02/28/%E6%8E%92%E5%BA%8F_DENSE_RANK/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="rank"><a href="#rank" class="headerlink" title="rank()"></a>rank()</h2><h2 id="dense-rank"><a href="#dense-rank" class="headerlink" title="dense_rank()"></a>dense_rank()</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">DENSE_RANK() OVER (PARTITION BY column1, column2... ORDER BY column3, column4...)</span><br></pre></td></tr></table></figure>
<ul>
<li>PARTITION BY子句是可选的,用于将数据分成不同的分组。如果不指定PARTITION BY子句,将对整个结果集进行排名。</li>
<li>ORDER BY子句指定用于排序的列。可以根据一个或多个列进行排序,以确定排名的顺序。</li>
</ul>
<span id="more"></span>
<h3 id="example"><a href="#example" class="headerlink" title="example"></a>example</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank</span><br><span class="line">FROM employees;</span><br></pre></td></tr></table></figure>
<p>当使用DENSE_RANK函数和PARTITION BY子句时,以下是示例查询的可能返回结果:</p>
<p>示例1:对每个客户的订单金额进行排名</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT order_id, customer_id, order_amount,</span><br><span class="line"> DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY order_amount DESC) AS dense_rank</span><br><span class="line">FROM orders;</span><br></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th>order_id</th>
<th>customer_id</th>
<th>order_amount</th>
<th>dense_rank</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>1001</td>
<td>500</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>1001</td>
<td>500</td>
<td>1</td>
</tr>
<tr>
<td>3</td>
<td>1001</td>
<td>300</td>
<td>2</td>
</tr>
<tr>
<td>4</td>
<td>1002</td>
<td>700</td>
<td>1</td>
</tr>
<tr>
<td>5</td>
<td>1002</td>
<td>600</td>
<td>2</td>
</tr>
<tr>
<td>6</td>
<td>1002</td>
<td>600</td>
<td>2</td>
</tr>
<tr>
<td>7</td>
<td>1002</td>
<td>400</td>
<td>3</td>
</tr>
</tbody></table>
<p>在上述结果中,我们根据每个客户的订单金额进行了排名。客户ID为1001的客户有两个订单,订单金额都是500,因此它们被分配相同的密集排名1。客户ID为1001的第三个订单金额为300,所以它被分配密集排名2。对于客户ID为1002的客户,有一个订单金额为700,它被分配密集排名1,然后有两个订单金额为600,它们被分配密集排名2,最后一个订单金额为400,它被分配密集排名3。</p>
<p>示例2:对每个班级的学生成绩进行排名</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT student_id, class_id, exam_score,</span><br><span class="line"> DENSE_RANK() OVER (PARTITION BY class_id ORDER BY exam_score DESC) AS dense_rank</span><br><span class="line">FROM students;</span><br></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th>student_id</th>
<th>class_id</th>
<th>exam_score</th>
<th>dense_rank</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>A</td>
<td>95</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>A</td>
<td>90</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>A</td>
<td>85</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>B</td>
<td>92</td>
<td>1</td>
</tr>
<tr>
<td>5</td>
<td>B</td>
<td>88</td>
<td>2</td>
</tr>
<tr>
<td>6</td>
<td>B</td>
<td>88</td>
<td>2</td>
</tr>
<tr>
<td>7</td>
<td>B</td>
<td>80</td>
<td>3</td>
</tr>
</tbody></table>
<p>在上述结果中,我们根据每个班级的考试成绩进行了排名。班级ID为A的学生有三个学生,分别获得了95、90和85分,他们分别被分配密集排名1、2和3。班级ID为B的学生有四个学生,分别获得了92、88、88和80分,他们分别被分配密集排名1、2、2和3。</p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>SQL</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>SQL</tag>
<tag>排序</tag>
</tags>
</entry>
<entry>
<title>DATEDIFF_日期之差</title>
<url>/2023/03/02/DATEDIFF_%E6%97%A5%E6%9C%9F%E4%B9%8B%E5%B7%AE/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>DATEDIFF是一个SQL函数,用于计算两个日期之间的差距。</p>
<p>DATEDIFF函数的语法如下:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">DATEDIFF(datepart, startdate, enddate)</span><br></pre></td></tr></table></figure>
<ul>
<li><code>datepart</code>参数是用于指定日期部分的字符串,表示希望计算的差距类型。常见的datepart包括:年(year)、季度(quarter)、月(month)、周(week)、天(day)、小时(hour)、分钟(minute)、秒(second)等。</li>
<li><code>startdate</code>参数是起始日期。</li>
<li><code>enddate</code>参数是结束日期。</li>
</ul>
<p>DATEDIFF函数会根据指定的datepart,计算出enddate与startdate之间的差距,并以整数形式返回差距值。</p>
<p>以下是一个示例,演示如何使用DATEDIFF函数计算两个日期之间的天数差距:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT DATEDIFF(day, '2021-01-01', '2021-01-10') AS DayDifference;</span><br></pre></td></tr></table></figure>
<p>上述查询将返回结果为9,表示从2021年1月1日到2021年1月10日之间相差了9天。</p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>SQL</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>SQL</tag>
</tags>
</entry>
<entry>
<title>GroupBy</title>
<url>/2023/03/04/GroupBy/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>当我们需要对数据进行分组并进行聚合计算时,可以使用GROUP BY子句。GROUP BY子句通常与聚合函数(如SUM、COUNT、AVG等)一起使用。</p>
<p>通过GROUP BY子句,我们可以将数据按照指定的列进行分组,并对每个组进行聚合计算。这些聚合计算的结果将基于每个组的值。</p>
<p>下面是一个示例,假设我们有一个名为”orders”的表,其中包含了订单信息:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT product_id, COUNT(*) as total_orders</span><br><span class="line">FROM orders</span><br><span class="line">GROUP BY product_id;</span><br></pre></td></tr></table></figure>
<span id="more"></span>
<p>在上述示例中,我们按照”product_id”列进行了分组,并计算了每个产品的订单总数。通过使用COUNT(*)函数,我们可以计算每个产品的订单数量。</p>
<p>GROUP BY子句可以与多个列一起使用,以便更细致地分组数据。例如:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">SELECT category_id, product_id, COUNT(*) as total_orders</span><br><span class="line">FROM orders</span><br><span class="line">GROUP BY category_id, product_id;</span><br></pre></td></tr></table></figure>
<p>在这个示例中,我们按照”category_id”和”product_id”两列进行了分组,并计算了每个产品在每个类别中的订单总数。</p>
<p>需要注意的是,GROUP BY子句必须与SELECT语句一起使用,并且SELECT语句中的列必须是GROUP BY子句中的列或者是聚合函数的参数。这样才能确保查询的正确性。</p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>SQL</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>SQL</tag>
</tags>
</entry>
<entry>
<title>SQL窗口函数_LEAD_LAG详解</title>
<url>/2023/03/04/SQL%E7%AA%97%E5%8F%A3%E5%87%BD%E6%95%B0_LEAD_LAG%E8%AF%A6%E8%A7%A3/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>当涉及到SQL窗口函数时,LEAD()和LAG()是两个非常有用的函数。它们允许我们在查询中访问当前行之前或之后的行的值。</p>
<p>LEAD()函数返回当前行之后的指定行数的值,而LAG()函数返回当前行之前的指定行数的值。这两个函数在许多情况下都很有用,例如在分析时间序列数据或计算相邻行之间的差异时。</p>
<p>让我们以一个简单的示例来说明LEAD()和LAG()函数的用法。假设我们有一个名为sales的表,其中包含了销售数据:</p>
<p>sales表:</p>
<table>
<thead>
<tr>
<th>sale_id</th>
<th>sale_date</th>
<th>sale_amount</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>2021-01-01</td>
<td>1000</td>
</tr>
<tr>
<td>2</td>
<td>2021-01-02</td>
<td>1500</td>
</tr>
<tr>
<td>3</td>
<td>2021-01-03</td>
<td>2000</td>
</tr>
<tr>
<td>4</td>
<td>2021-01-04</td>
<td>1200</td>
</tr>
<tr>
<td>5</td>
<td>2021-01-05</td>
<td>1800</td>
</tr>
</tbody></table>
<p>如果我们想要计算每天的销售额与前一天销售额的差异,我们可以使用LAG()函数:</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> sale_date,</span><br><span class="line"> sale_amount,</span><br><span class="line"> <span class="built_in">LAG</span>(sale_amount) <span class="keyword">OVER</span> (<span class="keyword">ORDER</span> <span class="keyword">BY</span> sale_date) <span class="keyword">AS</span> previous_day_sale_amount,</span><br><span class="line"> sale_amount <span class="operator">-</span> <span class="built_in">LAG</span>(sale_amount) <span class="keyword">OVER</span> (<span class="keyword">ORDER</span> <span class="keyword">BY</span> sale_date) <span class="keyword">AS</span> difference</span><br><span class="line"><span class="keyword">FROM</span></span><br><span class="line"> sales;</span><br></pre></td></tr></table></figure>
<span id="more"></span>
<p>上述查询中,我们使用了LAG()函数来获取前一天的销售额,并通过与当前销售额的差异计算了difference列的值。通过指定ORDER BY子句,我们可以按照日期的顺序进行计算。</p>
<p>类似地,如果我们想要计算每天的销售额与后一天销售额的差异,我们可以使用LEAD()函数:</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> sale_date,</span><br><span class="line"> sale_amount,</span><br><span class="line"> <span class="built_in">LEAD</span>(sale_amount) <span class="keyword">OVER</span> (<span class="keyword">ORDER</span> <span class="keyword">BY</span> sale_date) <span class="keyword">AS</span> next_day_sale_amount,</span><br><span class="line"> <span class="built_in">LEAD</span>(sale_amount) <span class="keyword">OVER</span> (<span class="keyword">ORDER</span> <span class="keyword">BY</span> sale_date) <span class="operator">-</span> sale_amount <span class="keyword">AS</span> difference</span><br><span class="line"><span class="keyword">FROM</span></span><br><span class="line"> sales;</span><br></pre></td></tr></table></figure>
<p>这次,我们使用了LEAD()函数来获取后一天的销售额,并计算了差异。</p>
<p>LEAD()和LAG()函数还支持更复杂的用法,比如指定分区(PARTITION BY)来在不同的组中进行计算,以及指定默认值以处理边界情况。它们可以极大地提升分析和比较相邻行的能力。</p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>SQL</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>SQL</tag>
</tags>
</entry>
<entry>
<title>Pandas基本操作</title>
<url>/2023/03/15/Pandas%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="查看数据"><a href="#查看数据" class="headerlink" title="查看数据"></a>查看数据</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment">## 查看头部 head(n)</span></span><br><span class="line">df.head() <span class="comment">#默认查看前5条记录 </span></span><br><span class="line">df.head(<span class="number">8</span>) <span class="comment">#指定查看前8条记录</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">## 查看尾部 tail(n)</span></span><br><span class="line">df.tail() <span class="comment">#默认查看后面5条记录 </span></span><br><span class="line">df.tail(<span class="number">4</span>) <span class="comment">#指定查看后面4条记录</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 随机查看样本 sample(n)</span></span><br><span class="line">df.sample() <span class="comment">#随机查看一条记录 </span></span><br><span class="line">df.sample(<span class="number">4</span>) <span class="comment">#随机查看4条记录</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 查看统计摘要</span></span><br><span class="line">df.describe() <span class="comment">#返回所有数字列的统计摘要</span></span><br></pre></td></tr></table></figure>
<span id="more"></span>
<h1 id="检索数据"><a href="#检索数据" class="headerlink" title="检索数据"></a>检索数据</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment">## 切片[]</span></span><br><span class="line">df[<span class="number">0</span>:<span class="number">3</span>] <span class="comment">#通过切片检索行数据</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## loc\iloc</span></span><br><span class="line">df.loc[<span class="number">1</span>] <span class="comment">#标量标签,返回该行标签的Series数据 </span></span><br><span class="line">df.loc[[<span class="number">1</span>,<span class="number">3</span>]] <span class="comment">#标签列表,返回标签列表的行DataFrame数据 </span></span><br><span class="line">df.loc[<span class="number">0</span>:<span class="number">3</span>] <span class="comment">#切片对象,返回切片的行DataFrame数据 </span></span><br><span class="line">df.loc[<span class="number">0</span>:<span class="number">3</span>,<span class="string">'staff_id'</span>:<span class="string">'staff_salary'</span>] <span class="comment">#根据行切片,列切片检索数据 </span></span><br><span class="line">df.loc[[<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>],[<span class="string">'staff_id'</span>,<span class="string">'staff_name'</span>,<span class="string">'staff_age'</span>]] <span class="comment">#根据行标签列表,列标签列表检索数据</span></span><br><span class="line">df.iloc[<span class="number">1</span>] <span class="comment">#整数标量选择,数据从0开始,为1的就是第二行的数据,返回的是Series </span></span><br><span class="line">df.iloc[[<span class="number">1</span>,<span class="number">3</span>]] <span class="comment">#整数列表选择,选择位置为1和3的数据,返回的是DataFrame </span></span><br><span class="line">df.iloc[<span class="number">1</span>:<span class="number">3</span>] <span class="comment">#切片选择,选择位置1至2的数据,不包含边界结束值,也就是不包含3的位置 </span></span><br><span class="line">df.iloc[<span class="number">1</span>:<span class="number">3</span>,<span class="number">1</span>:<span class="number">4</span>] <span class="comment">#切片选择位置为1至3的行和1至4的列不含位置为3的行和位置为4的列</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## at\iat</span></span><br><span class="line">df.at[<span class="string">'A'</span>,<span class="string">'staff_name'</span>] <span class="comment">#检索第“A”行的列标签为"staff_name"的数据 df.iat[0,1] #检索第1行第2列的数据</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>python</category>
<category>pandas</category>
</categories>
<tags>
<tag>笔记</tag>
<tag>python</tag>
</tags>
</entry>
<entry>
<title>Python网站开发库大全</title>
<url>/2023/03/15/Python%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91%E5%BA%93%E5%A4%A7%E5%85%A8/</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote>
<p>Q:Web 框架到底是什么?<br>A:Web 框架主要用于网站开发。开发者在基于 Web 框架实现自己的业务逻辑。Web 框架实现了很多功能,为实现业务逻辑提供了一套通用方法。 </p>
</blockquote>
<blockquote>
<p>Q:Web 框架有什么作用?<br>A:使用 Web 框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。Web 框架使得在进行 网站开发的时候,减少了工作量。 </p>
</blockquote>
<blockquote>
<p>Q:我们为什么要使用 Web 框架?<br>A:Web 框架主要用于网站开发,可以实现数据的交互和业务功能的完善。使用 Web 框架进行 网站开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。</p>
</blockquote>
<blockquote>
<p>库排序是<strong>按照使用人数和文档的活跃度</strong>为参考进行的, <strong>建议大家使用排名靠前的框架,因为它们的文档更齐全,技术积累要更多,社区更繁盛,能得到更好的支持,</strong> 这样在遇到自己无法解决的问题,可以更快更高效的找到解答的方案。</p>
</blockquote>
<span id="more"></span>
<hr>
<h2 id="1-Django-框架"><a href="#1-Django-框架" class="headerlink" title="1. Django 框架"></a><a href="#1-Django-%E6%A1%86%E6%9E%B6" title="1. Django 框架"></a><strong>1. Django 框架</strong></h2><p>官 网:<a href="https://github.com/django/django.git">https://github.com/django/django.git</a></p>
<p>优 点:是一个高层次 Python Web 开发框架,特点是开发快速、代码较少、可扩展性强。Django 采用 MTV(Model、Template、View)模型组织资源,框架功能丰富,模板扩展选择最多。对于专业人员来说,Django 是当之无愧的 Python 排名第一的 Web 开发框架。</p>
<p>缺 点:包括一些轻量级应用不需要的功能模块,不如 Flask 轻便。过度封装很多类和方法,直接使用比较简单,但改动起来比较困难。相比于 C,C++ 性能,Djang 性能偏低。模板实现了代码和样式完全分离,不允许模板里出现 Python 代码,灵活度不够。另外学习曲线也相对陡峭。</p>
<p><a href="https://mmbiz.qpic.cn/sz_mmbiz_png/NOM5HN2icXzyamXia4vqrASM2pALYlNo8WYrEN2TT3JLXOv80vtCf8K0a96VIZhTkJyicLJaIxutXiaj3Bqg35A85Q/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/NOM5HN2icXzyamXia4vqrASM2pALYlNo8WYrEN2TT3JLXOv80vtCf8K0a96VIZhTkJyicLJaIxutXiaj3Bqg35A85Q/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<p><a href="#2-Flask-%E6%A1%86%E6%9E%B6" title="2. Flask 框架"></a></p>
<p><strong>2. Flask 框架</strong></p>
<p>官 网:<br><a href="https://flask.palletsprojects.com/en/2.0.x/">https://flask.palletsprojects.com/en/2.0.x/</a></p>
<p>优 点:Flask 是一个 Python Web 开发的微框架,严格来说,它仅提供 Web 服务器支持,不提供全栈开发支持。然而,Flask 非常轻量、非常简单,基于它搭建 Web 系统都以分钟来计时,特别适合小微原型系统的开发。花少时间、产生可用系统,是非常划算的选择。</p>
<p>缺 点:对于大型网站开发,需要设计路由映射的规则,否则导致代码混乱。对新手来说,容易使用低质量的代码创建 “不良的 web 应用程序”。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vAiaftbfrTfdtw80vC1f1v3sZeyM88EESzUMY8gMuCibp7GBn9Bhh293w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vAiaftbfrTfdtw80vC1f1v3sZeyM88EESzUMY8gMuCibp7GBn9Bhh293w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<p><a href="#3-Pyramid-%E6%A1%86%E6%9E%B6" title="3. Pyramid 框架"></a></p>
<p><strong>3. Pyramid 框架</strong></p>
<p>官 网:<a href="https://trypyramid.com/">https://trypyramid.com/</a></p>
<p>优 点:是一个扩展性很强且灵活的 Python Web 开发框架。上手十分容易,比较适合中等规模且边开发边设计的场景。Pyramid 不提供绝对严格的框架定义,根据需求可以扩展开发,对高阶程序员十分友好。</p>
<p>缺 点:国内知名度不高,高级用法需要通过阅读源代码获取灵感。默认使用 Chameleon 模板,灵活度没有成为一个要素。</p>
<p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7v4I1icBJbaweObDQ078rCFMiaScj58Zk10eeKzLdIu15KsnYalbmKXNhw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></p>
<p><a href="#4-web-py-%E6%A1%86%E6%9E%B6" title="4. web.py 框架"></a></p>
<p><strong>4. web.py 框架</strong></p>
<p>官 网:<a href="https://webpy.org/">https://webpy.org/</a></p>
<p>优 点:正如其名,web.py 是一个采用 Python 作为开发语言的 Web 框架,简单且强大。俄罗斯排名第一的 Yandex 搜索引擎基于这个框架开发,Guido van Rossum 认为这是最好的 Python Web 框架,还需要说别的吗?有事实作证、有大牛认可,用起来吧!</p>
<p>缺 点:Web.py 并未像其他框架一样保持与 Python 3 兼容性的最新状态。这不仅意味着缺乏对异步语法的支持,还意味着缺少对已弃用的函数的错误。此外,目前尚不清楚维护者是否有计划在 Python 2 到达其支持生命周期结束后保持 Web.py 的最新状态。</p>
<p><a href="#5-Tornado-%E6%A1%86%E6%9E%B6" title="5. Tornado 框架"></a></p>
<h2 id="5-Tornado-框架"><a href="#5-Tornado-框架" class="headerlink" title="5. Tornado 框架"></a><strong>5. Tornado 框架</strong></h2><p>官 网:</p>
<p><a href="https://www.tornadoweb.org/en/stable/">https://www.tornadoweb.org/en/stable/</a></p>
<p>优 点:Tornado 是一个基于异步网络功能库的 Web 开发框架,因此,它能支持几万个开放连接,Web 服务高效稳定。可见,Tornado 适合高并发场景下的 Web 系统,开发过程需要采用 Tornado 提供的框架,灵活性较差,确定场景后再考虑使用不迟。</p>
<p>缺 点:Tornado 5.0 改进了与 Python 的本机异步功能的集成。因此不再支持 Python 3.3,并且 Python 3.5 用户必须使用 Python 3.5.2 或更高版本。Tornado 6.0 将需要 Python 3.5 及更高版本,并将完全放弃 Python 2 支持。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="6-TurboGears-框架"><a href="#6-TurboGears-框架" class="headerlink" title="6. TurboGears 框架"></a><a href="#6-TurboGears-%E6%A1%86%E6%9E%B6" title="6. TurboGears 框架"></a><strong>6. TurboGears 框架</strong></h2><p>官 网:</p>
<p><a href="https://www.turbogears.org/">https://www.turbogears.org/</a></p>
<p>优 点:TurboGears 最新版本 试图解决 TurboGears 最初版本、Django、Rails 等框架缺陷,它支持多数据库、JavaScript 工具集、多种数据交换格式等,当然,它开发非常高效,扩展性很强。试问它与 Django 哪个更好?还真不好说,Django 社区更为活跃或许更重要。</p>
<p>缺 点:TurboGears 的一些缺点包括管理功能较为基础,较少的第三方应用程序以及只有初级的文档。TurboGears 的一个重大挑战是它的压倒性。因为它混搭的其他组件都提供无限的灵活性, 当试图决定何种路径来完成一个任务时它是过于复杂的。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="7-CherryPy-框架"><a href="#7-CherryPy-框架" class="headerlink" title="7. CherryPy 框架"></a><a href="#7-CherryPy-%E6%A1%86%E6%9E%B6" title="7. CherryPy 框架"></a><strong>7. CherryPy 框架</strong></h2><p>官 网:</p>
<p><a href="https://cherrypy.org/">https://cherrypy.org/</a></p>
<p>优 点:CherryPy 能够让开发者按照其他面向对象程序相似的设计方法开发 Web 系统,进而采用最少的代码、最简洁的方式。CherryPy 已经开发了 10 年之久,稳定性较好,非常适合小规模 Web 系统和纯粹的 Python 程序员。感受到了什么?Python 大有一统江湖之势!拭目以待。</p>
<p>缺 点:只包含为 web 页面提供服务所需的少量内容外,它应该尽可能地让人感觉它不像 “web 框架”,而是像任何其他类型的 Python 应用程序一样。CherryPy 包含的位用作低级构建块。包括会话标识符和 cookie 处理,但不包括 HTML 模板。像 Bottle 一样,CherryPy 提供了一种将路由映射到磁盘上的目录以供静态文件服务的方法。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="8-Falcon-框架"><a href="#8-Falcon-框架" class="headerlink" title="8. Falcon 框架"></a><a href="#8-Falcon-%E6%A1%86%E6%9E%B6" title="8. Falcon 框架"></a><strong>8. Falcon 框架</strong></h2><p>官 网:</p>
<p><a href="http://falconframework.org/">http://falconframework.org/</a></p>
<p>优 点:Falcon 是一个支持大规模微服务 API 或移动 App 后端响应的 Web 开发框架,它完全基于 Python 并提供了非常高的性能、可靠性和可扩展性。Falcon 定位独特且特色鲜明,对于 App 开发者,后端系统构建不妨考虑 Falcon,十之八九是不会后悔的。</p>
<p>缺 点:Falcon 缺点是其打包模块有点太少,有路由,中间件,钩子,除此之外就不提供其他功能了(裸壳)。额外其他功能,比如验证等都需要开发人员来开发扩展。因为其设计中就假设用于构建 REST API。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="9-Asgineer-框架"><a href="#9-Asgineer-框架" class="headerlink" title="9. Asgineer 框架"></a><a href="#9-Asgineer-%E6%A1%86%E6%9E%B6" title="9. Asgineer 框架"></a><strong>9. Asgineer 框架</strong></h2><p>官 网:</p>
<p><a href="https://asgineer.readthedocs.io/">https://asgineer.readthedocs.io/</a></p>
<p>优 点:Asgineer 是一种编写异步 Web 应用程序的工具,使用尽可能少的抽象,同时仍然提供友好的 API。只需几分钟即可阅读指南和参考资料!在 Uvicorn 上运行 Asgineer 时,它是可用的最快的 Web 框架之一。它支持 http 长轮询、服务器端事件 (SSE) 和 websockets。并且具有以正确(且快速)的方式为资产提供服务的实用程序。</p>
<p>缺 点:中文文档匮乏。</p>
<h2 id="10-Bottle-框架"><a href="#10-Bottle-框架" class="headerlink" title="10. Bottle 框架"></a><a href="#10-Bottle-%E6%A1%86%E6%9E%B6" title="10. Bottle 框架"></a><strong>10. Bottle 框架</strong></h2><p>官 网:</p>
<p><a href="https://bottlepy.org/docs/dev/">https://bottlepy.org/docs/dev/</a></p>
<p>优 点:Bottle 是一个用于 Python 的快速、简单和轻量级的 WSGI 微型网络框架。它作为单个文件模块分发,除了 Python 标准库之外没有任何依赖项。支持干净和动态的 URL。快速和 Pythonic 内置模板引擎,支持 mako、jinja2 和 cheetah 模板。方便地访问表单数据、文件上传、cookie、标题和其他与 HTTP 相关的元数据。</p>
<p>缺 点:Bottle 极简主义的一个后果是有些功能根本就不存在。不支持表单验证,包括 CSRF 保护等功能。如果要构建支持高度用户交互的 Web 应用程序,则需要自己添加它们。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vmZ60TGFscqJgX8Dx5ZTYeYUFQW5tzW6dHLDCTUiatwZ6He0iaT9JTB3Q/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vmZ60TGFscqJgX8Dx5ZTYeYUFQW5tzW6dHLDCTUiatwZ6He0iaT9JTB3Q/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<h2 id="11-Emmett-框架"><a href="#11-Emmett-框架" class="headerlink" title="11. Emmett 框架"></a><a href="#11-Emmett-%E6%A1%86%E6%9E%B6" title="11. Emmett 框架"></a><strong>11. Emmett 框架</strong></h2><p>官 网:</p>
<p><a href="https://emmett.sh/">https://emmett.sh/</a></p>
<p>优 点:编写优雅的代码,专注于您的产品,你应该把更多的时间花在你的产品而不是底层框架上。Emmett 是发明家的框架,因为它旨在简化您的开发过程,其语法简单、易于学习和理解。不要在路由器和不舒服的模式之间浪费时间:每次为应用程序写下路由时,一切都清楚地呈现在您的眼前。</p>
<p>缺 点:中文文档匮乏。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="12-apidaora-框架"><a href="#12-apidaora-框架" class="headerlink" title="12. apidaora 框架"></a><a href="#12-apidaora-%E6%A1%86%E6%9E%B6" title="12. apidaora 框架"></a><strong>12. apidaora 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/dutradda/apidaora">https://github.com/dutradda/apidaora</a></p>
<p>优 点:使用类型注释将请求 / 响应声明为数据类和字典,使用 jsondaora 验证输入数据,最快的 python api 框架之一,可以在任何 asgi 服务器上运行。</p>
<p>缺 点:中文文档匮乏。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="13-Quixote-框架"><a href="#13-Quixote-框架" class="headerlink" title="13. Quixote 框架"></a><a href="#13-Quixote-%E6%A1%86%E6%9E%B6" title="13. Quixote 框架"></a><strong>13. Quixote 框架</strong></h2><p>官 网:</p>
<p><a href="http://www.quixote.ca/">http://www.quixote.ca/</a></p>
<p>优 点:Quixote 是一个使用 Python 编写基于 Web 的应用程序的框架。它的目标是按此顺序实现灵活性和高性能。Quixote 应用程序的结构往往类似于传统应用程序。格式化网页的逻辑由 Python 类和函数组成。Quixote 不强制分离表示逻辑和 “后端” 逻辑。相反,我们鼓励您使用传统技术。例如,一种解决方案是将表示逻辑放在其自己的子包中。</p>
<p>缺 点:虽然 Quixote 得到积极维护,但发布频率较低。最近开发的重点是修复错误、提高标准合规性和增加 Quixote 的灵活性。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="14-reahl-框架"><a href="#14-reahl-框架" class="headerlink" title="14. reahl 框架"></a><a href="#14-reahl-%E6%A1%86%E6%9E%B6" title="14. reahl 框架"></a><strong>14. reahl 框架</strong></h2><p>官 网:</p>
<p><a href="https://www.reahl.org/">https://www.reahl.org/</a></p>
<p>优 点:reahl 是一个可以让开发者完全用 Python 语言编写 Web 应用的开放框架,采用 Python 作为唯一开发语言是其最大特色。此外,reahl 提供了相当清晰且简明的开发组建,对于开发一般功能性 Web 系统足够清晰且可行。</p>
<p>缺 点:提供抽象词汇时,无法掌握一些更高级的用户界面效果,目前不允许使用 Sass 构建 Bootstrap 的修改版本,并支持更高级的用户界面模式</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="15-hug-框架"><a href="#15-hug-框架" class="headerlink" title="15. hug 框架"></a><a href="#15-hug-%E6%A1%86%E6%9E%B6" title="15. hug 框架"></a><strong>15. hug 框架</strong></h2><p>官 网:</p>
<p><a href="https://hug.rest/">https://hug.rest/</a></p>
<p>优 点:Hug 是一个 Python 3 API 开发框架。它的设计使软件工程师可以一次开发 API,然后在需要时再使用它。Hug 框架通过提供各种接口来简化 API 开发。这就是为什么该框架被称为 Python 3 中最快的框架之一的主要原因。</p>
<p>缺 点:它使用以前的 WSGI 标准,这是一个同步框架,所以它不能处理像 WebSockets 和其他异步请求,不管怎么说,它仍然有非常好的性能表现。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7v74UvLQavzuEJFkBeosPwAWf2s29CEg6GujeX2jUSztYovC6HZsQrpg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7v74UvLQavzuEJFkBeosPwAWf2s29CEg6GujeX2jUSztYovC6HZsQrpg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<h2 id="16-BlackSheep-框架"><a href="#16-BlackSheep-框架" class="headerlink" title="16. BlackSheep 框架"></a><a href="#16-BlackSheep-%E6%A1%86%E6%9E%B6" title="16. BlackSheep 框架"></a><strong>16. BlackSheep 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/Neoteroi/BlackSheep">https://github.com/Neoteroi/BlackSheep</a></p>
<p>优 点:BlackSheep 是一个异步 Web 框架,用于使用 Python 构建基于事件的 Web 应用程序。它的灵感来自 Flask、ASP.NET Core 和 Yury Selivanov 的工作。</p>
<p>缺 点:中文文档匮乏。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vYGSFXA48xGBc8Rseoq1BdruQWzGeVQE5DVbkQygQemKdUHmEJU80FA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vYGSFXA48xGBc8Rseoq1BdruQWzGeVQE5DVbkQygQemKdUHmEJU80FA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<h2 id="17-Index-py-框架"><a href="#17-Index-py-框架" class="headerlink" title="17. Index.py 框架"></a><a href="#17-Index-py-%E6%A1%86%E6%9E%B6" title="17. Index.py 框架"></a><strong>17. Index.py 框架</strong></h2><p>官 网:</p>
<p><a href="https://index-py.aber.sh/stable/">https://index-py.aber.sh/stable/</a></p>
<p>优 点:实现了 ASGI3 接口并使用 Radix Tree 进行路由查找。是最快的 Python web 框架之一。一切特性都服务于快速开发高性能的 Web 服务。大量正确的类型注释,灵活且高效的路由系统,可视化 API 接口与在线调试,支持 Server-sent events 与 WebSocket,自带一键部署命令 (基于 uvicorn 与 gunicorn),可使用任何可用的 ASGI 生态。</p>
<p>缺 点:Index.py 不内置数据库、缓存等其他功能。选择困难者请直接使用 Django。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="18-Sanic-框架"><a href="#18-Sanic-框架" class="headerlink" title="18. Sanic 框架"></a><a href="#18-Sanic-%E6%A1%86%E6%9E%B6" title="18. Sanic 框架"></a><strong>18. Sanic 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/sanic-org/sanic">https://github.com/sanic-org/sanic</a></p>
<p>优 点:Sanic 是一个 Python 3.7+ web 服务器和 web 框架,它的编写速度很快。它允许使用 Python 3.5 中添加的 async/await 语法,这使您的代码无阻塞且快速。该项目的目标是提供一种简单的方法来启动和运行一个高性能的 HTTP 服务器,该服务器易于构建、扩展和最终扩展。</p>
<p>缺 点:就功能方面 Sanic 模仿 Flask,比如通过共享 Blueprints 的概念,微小的子应用程序,允许开发人员在更大的应用程序中拆分和组织其代码。对于光光是数据增删改查 CRUD 应用,Sanic 也不是一个好的选择。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="19-Starlette-框架"><a href="#19-Starlette-框架" class="headerlink" title="19. Starlette 框架"></a><a href="#19-Starlette-%E6%A1%86%E6%9E%B6" title="19. Starlette 框架"></a><strong>19. Starlette 框架</strong></h2><p>官 网:</p>
<p><a href="https://pypi.org/project/starlette/">https://pypi.org/project/starlette/</a></p>
<p>优 点:Starlette 是一个轻量级的 ASGI 框架 / 工具包,非常适合构建性能异步服务,它是生产就绪的,并为您提供以下内容:令人印象深刻的表现。WwbSocket 支持。GraphQL 支持。进程内后台任务。启动和关闭事件。基于请求构建的测试客户端。CORS、GZip、静态文件、流响应。会话和 Cookie 支持。100% 的测试覆盖率。100% 类型注释代码库。零硬依赖。</p>
<p>缺 点:Starlette 提供了所有基本的 Web 微框架功能。但是它不提供自动数据验证,序列化或 API 文档。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="20-Fastapi-框架"><a href="#20-Fastapi-框架" class="headerlink" title="20. Fastapi 框架"></a><a href="#20-Fastapi-%E6%A1%86%E6%9E%B6" title="20. Fastapi 框架"></a><strong>20. Fastapi 框架</strong></h2><p>官 网:</p>
<p><a href="https://fastapi.tiangolo.com/">https://fastapi.tiangolo.com/</a></p>
<p>优 点:FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。非常高的性能,与 NodeJS 和 Go 相当(感谢 Starlette 和 Pydantic)。可用的最快的 Python 框架之一。减少大约 40% 的人为(开发人员)引发的错误。简短,简单,直观,健壮。</p>
<p>缺 点:本身不带模板语法,需要安装模板语法</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="21-Responder-框架"><a href="#21-Responder-框架" class="headerlink" title="21. Responder 框架"></a><a href="#21-Responder-%E6%A1%86%E6%9E%B6" title="21. Responder 框架"></a><strong>21. Responder 框架</strong></h2><p>官 网:</p>
<p><a href="https://python-responder.org/">https://python-responder.org/</a></p>
<p>优 点:是 kennethreitz 新开发的一个项目,是一个基于 Python 的 HTTP 服务框架。底层用了 Starlette 的框架,Starlette 是一款轻量级的 ASGI 框架 / 工具包, 可以用 Starlette 构建高性能的异步 IO 服务。相对于 Starlette , responder 对开发者更加友好一点。kennethreitz 写了 requests 号称 “HTTP for Humans” 更加清楚这一点。事实上比较下来,responder 也比 Starlette 优雅很多。</p>
<p>缺 点:可能是新项目, 打包还不太完善。就目前版本而言,少许代码还不能正常工作。但接口形式已经定义完毕,期待后面版本会加上去。</p>
<h2 id="22-Molten-框架"><a href="#22-Molten-框架" class="headerlink" title="22. Molten 框架"></a><a href="#22-Molten-%E6%A1%86%E6%9E%B6" title="22. Molten 框架"></a><strong>22. Molten 框架</strong></h2><p>官 网:</p>
<p><a href="https://moltenframework.com/">https://moltenframework.com/</a></p>
<p>优 点:Molten 是一个最小的、可扩展的、快速的和高效的框架,用于使用 Python 构建 HTTP API。计划自动验证请求,代码更容易维护。实例可自动序列化,包含 API 在现实世界中通常要求的各种功能,广泛使用 PEP484 类型提示和 mypy。</p>
<p>缺 点:它没有使用像第三方库(如 Pydantic)提供数据验证,序列化和文档,它有自己的库。因此,这些数据类型定义将不太容易重用。依赖注入系统需要对依赖项进行预注册,并且将基于已声明的类型解决依赖问题。因此,不可能声明多个组件来提供一个特定的类型。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="23-Clastic-框架"><a href="#23-Clastic-框架" class="headerlink" title="23. Clastic 框架"></a><a href="#23-Clastic-%E6%A1%86%E6%9E%B6" title="23. Clastic 框架"></a><strong>23. Clastic 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/mahmoud/clastic">https://github.com/mahmoud/clastic</a></p>
<p>优 点:一个功能强大的 Python Web 框架,可简化显式开发实践,同时消除全局状态。Clastic 是完全用 Python 语言编写的,增强可重用性和可测试性,主动 URL 路由检查,更好地控制应用程序初始化,改进的中间件范例,没有全局状态,ORM 用法,更容易的 WSGI 集成。</p>
<p>缺 点:Clastic 没有构建全局状态;URL 路由规则参数和视图函数签名不匹配,在 Clastic 中,这种不匹配会在构建应用程序时引发异常。</p>
<h2 id="24-Aiohttp-框架"><a href="#24-Aiohttp-框架" class="headerlink" title="24. Aiohttp 框架"></a><a href="#24-Aiohttp-%E6%A1%86%E6%9E%B6" title="24. Aiohttp 框架"></a><strong>24. Aiohttp 框架</strong></h2><p>官 网:</p>
<p><a href="https://docs.aiohttp.org/en/stable/">https://docs.aiohttp.org/en/stable/</a></p>
<p>优 点:用于 asyncio 和 Python 的异步 HTTP 客户端 / 服务器。支持客户端和 HTTP 服务器,支持开箱即用的服务器 WebSockets 和客户端 WebSockets,没有回调地狱。Web 服务器具有中间件、信号和可插入路由。</p>
<p>缺 点:根据 RFC 7231 aiohttp 2.0 版本后做了接受 HEAD 请求的调整,使用之前版本并且用 add_ get () 添加的请</p>
<p>求,如果使用 HEAD 方法访问会返回 405。如果处理器会写入很多响应体内容,你可以在执行 HEAD 方法时跳过处理响应体内容以提高执行效率。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="25-Masonite-框架"><a href="#25-Masonite-框架" class="headerlink" title="25. Masonite 框架"></a><a href="#25-Masonite-%E6%A1%86%E6%9E%B6" title="25. Masonite 框架"></a><strong>25. Masonite 框架</strong></h2><p>官 网:</p>
<p><a href="https://docs.masoniteproject.com/">https://docs.masoniteproject.com/</a></p>
<p>优 点:现代和以开发人员为中心的 Python Web 框架致力于实现实际的 batteries,包括具有许多开箱即用功能的开发人员工具,具有极其可扩展的架构。Masonite 非常适合初学者开发人员进入他们的第一个 Web 应用程序,以及需要充分利用 Masonite 的全部潜力来完成他们的应用程序的经验丰富的开发人员。Masonite 努力实现从安装到部署的快速简便,因此开发人员可以尽可能快速有效地从概念到创建。将其用于您的下一个 SaaS!尝试一次,你就会坠入爱河。</p>
<p>缺 点:对于 Masonite 来说,最大的” 竞争对手” 是 Django, 因为社区正在竭尽全力将框架推向容易,令人愉悦的下一件大事。与 Django 相比,Masonite 仍然是婴儿,期待它未来的表现。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="26-Quart-框架"><a href="#26-Quart-框架" class="headerlink" title="26. Quart 框架"></a><a href="#26-Quart-%E6%A1%86%E6%9E%B6" title="26. Quart 框架"></a><strong>26. Quart 框架</strong></h2><p>官 网:</p>
<p><a href="https://pgjones.gitlab.io/quart/">https://pgjones.gitlab.io/quart/</a></p>
<p>优 点:Quart 是一个 Python 网络微框架。使用 Quart,您可以呈现和提供 HTML 模板,编写(RESTful)JSON API,服务 WebSockets,流请求和响应数据,几乎可以通过 HTTP 或 WebSocket 协议做任何事情。</p>
<p>缺 点:它仅支持 Python 3.7+。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="27-Tonberry-框架"><a href="#27-Tonberry-框架" class="headerlink" title="27. Tonberry 框架"></a><a href="#27-Tonberry-%E6%A1%86%E6%9E%B6" title="27. Tonberry 框架"></a><strong>27. Tonberry 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/Ayehavgunne/Tonberry">https://github.com/Ayehavgunne/Tonberry</a></p>
<p>优 点:一个符合 ASGI 的 Web 微框架,采用基于类的路由方法。受 CherryPy 的影响但与 asyncio 兼容。一个名为 Qactuar 的配套 ASGI 服务器是从这个目前正在进行的项目中产生的。</p>
<p>缺 点:在使用拉取请求,请使用自动格式化程序 iSort 和 Black 并使用 MyPy 验证代码。这是在不消除某些类型错误的情况下,并不总是可以使 MyPy 完全满意,但是至少尽你所能并谨慎使用注释 `# type: ignore`。最后,尝试,尽可能提供最准确的类型提示。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="28-cyclone-框架"><a href="#28-cyclone-框架" class="headerlink" title="28. cyclone 框架"></a><a href="#28-cyclone-%E6%A1%86%E6%9E%B6" title="28. cyclone 框架"></a><strong>28. cyclone 框架</strong></h2><p>官 网:</p>
<p><a href="https://cyclone.io/">https://cyclone.io/</a></p>
<p>优 点:Cyclone 是 Python 的 Web 服务器框架,它将 Tornado API 实现为 Twisted 协议。Twisted 是一个事件驱动的 Python 网络编程框架。它是最成熟的非阻塞 I/O 库之一,可供公众使用。Tornado 是 FriendFeed 网络服务器的开源版本,它是最流行和最快速的 Python 网络服务器之一,具有用于构建网络应用程序的非常不错的 API。除了丰富的功能集之外,Cyclone 还解决了 C10K 问题。</p>
<p>缺 点:Cyclone 不再支持 python 2.x 。</p>
<h2 id="29-Klein-框架"><a href="#29-Klein-框架" class="headerlink" title="29. Klein 框架"></a><a href="#29-Klein-%E6%A1%86%E6%9E%B6" title="29. Klein 框架"></a><strong>29. Klein 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/twisted/klein">https://github.com/twisted/klein</a></p>
<p>优 点:Klein 是一个微框架,用于使用 Python 开发可用于生产的 Web 服务。它是 “微” 的,因为它具有类似于 Bottle 和 Flask 的非常小的 API。它不是 “微”,因为它依赖于标准库之外的东西。这主要是因为它建立在广泛使用和经过良好测试的组件上,如 Werkzeug 和 Twisted。</p>
<p>缺 点:也许有点过时了。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vBnFIibORF9iby60Fibho0SD8w6yruia9Of1jRAUXYAZQsIx6CHvKoVNahA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vBnFIibORF9iby60Fibho0SD8w6yruia9Of1jRAUXYAZQsIx6CHvKoVNahA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<h2 id="30-nameko-框架"><a href="#30-nameko-框架" class="headerlink" title="30. nameko 框架"></a><a href="#30-nameko-%E6%A1%86%E6%9E%B6" title="30. nameko 框架"></a><strong>30. nameko 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/nameko/nameko">https://github.com/nameko/nameko</a></p>
<p>优 点:AMQP RPC 和事件(发布 - 订阅),HTTPGET、POST 和 websockets,CLI 实现简单快速的开发,用于单元和集成测试的实用程序。</p>
<p>缺 点:nameko 微服务出错不会自动打印错误日志,需要加上监控相关的依赖,计算密集型任务导致任务重试。</p>
<p><a href="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vwTOiczSh8vsIDoUOAVv04ykVES8IicWhI2mtGorInh5asXf3SicZFygKg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1"><img src="https://mmbiz.qpic.cn/mmbiz_png/iaGGR9eXibkibjc2xlbRh5D0T8OTQYFhT7vwTOiczSh8vsIDoUOAVv04ykVES8IicWhI2mtGorInh5asXf3SicZFygKg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" alt="Image"></a></p>
<h2 id="31-CubicWeb-框架"><a href="#31-CubicWeb-框架" class="headerlink" title="31. CubicWeb 框架"></a><a href="#31-CubicWeb-%E6%A1%86%E6%9E%B6" title="31. CubicWeb 框架"></a><strong>31. CubicWeb 框架</strong></h2><p>官 网:</p>
<p><a href="https://www.cubicweb.org/">https://www.cubicweb.org/</a></p>
<p>优 点:CubicWeb 是一种语义 Web 应用程序框架,在 LGPL 下获得许可,它使开发人员能够通过重用组件(称为立方体)并遵循众所周知的面向对象设计原则来有效地构建 Web 应用程序。满足常见需求的可重用组件(数据模型和视图)库,Python 编程语言的强大功能和灵活性,用于存储后端的 SQL 数据库、LDAP 目录、Subversion 和 Mercurial 的可靠性。</p>
<p>缺 点:要在 CubicWeb 应用程序中获取或操作持久数据,可以使用关系查询语言(RQL),RQL 提供了一种高度分离的路径来相互关联各种数据源。但是,随着它的实现,通过手动构建查询作为字符串,它可能会让习惯于 ORM 的开发人员感到过时。使用 CubicWeb 还有其他障碍。首先,设置可能很麻烦。另一个潜在的问题是缺少本机模板引擎;生成 HTML 留给开发人员。CubicWeb 支持 Python 3,但 Twisted 等模块本身并未完全移植。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="32-Zope2-框架"><a href="#32-Zope2-框架" class="headerlink" title="32. Zope2 框架"></a><a href="#32-Zope2-%E6%A1%86%E6%9E%B6" title="32. Zope2 框架"></a><strong>32. Zope2 框架</strong></h2><p>官 网:</p>
<p><a href="https://zope.readthedocs.io/en/latest/">https://zope.readthedocs.io/en/latest/</a></p>
<p>优 点:Zope 2 是一款基于 Python 的 Web 应用框架,是所有 Python Web 应用程序、工具的鼻祖,是 Python 家族一个强有力的分支。Zope 2 的 “对象发布” 系统非常适合面向对象开发方法,并且可以减轻开发者的学习曲线,还可以帮助你发现应用程序里一些不好的功能。</p>
<p>缺 点:Zope 不适用于简单的 RESTful API(每 Bottle 或 Flask),甚至不适用于具有交互性的基本网站(à la Django),由于 Zope 的尺寸和复杂性,安装需要一些工作;这不是简单地将源解压缩到项目子文件夹中的问题。</p>
<h2 id="33-Web2py-框架"><a href="#33-Web2py-框架" class="headerlink" title="33. Web2py 框架"></a><a href="#33-Web2py-%E6%A1%86%E6%9E%B6" title="33. Web2py 框架"></a><strong>33. Web2py 框架</strong></h2><p>官 网:</p>
<p><a href="http://web2py.com/">http://web2py.com/</a></p>
<p>优 点:Web2py 是一个用 Python 语言编写的免费的开源 Web 框架,旨在敏捷快速的开发 Web 应用,具有快速、可扩展、安全以及可移植的数据库驱动的应用,遵循 LGPLv3 开源协议。Web2py 提供一站式的解决方案,整个开发过程都可以在浏览器上进行,提供了 Web 版的在线开发,HTML 模版编写,静态文件的上传,数据库的编写的功能。其它的还有日志功能,以及一个自动化的 admin 接口。</p>
<p>缺 点:Web2py 的一个重要限制是它仅与 Python 2.x 兼容。首先,这意味着 Web2py 无法使用 Python 3 的异步语法。如果你依赖于 Python 3 独有的外部库,那么你就不走运了。但是,正在开展使 Web2py Python 3 兼容的工作,并且在撰写本文时它已接近完成</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="34-Pylons-框架"><a href="#34-Pylons-框架" class="headerlink" title="34. Pylons 框架"></a><a href="#34-Pylons-%E6%A1%86%E6%9E%B6" title="34. Pylons 框架"></a><strong>34. Pylons 框架</strong></h2><p>官 网:</p>
<p><a href="https://docs.pylonsproject.org/projects/pylons-webframework/en/latest/">https://docs.pylonsproject.org/projects/pylons-webframework/en/latest/</a></p>
<p>优 点:Pylons 是一个开放源代码的 Web 应用框架,使用 python 语言编写。它对 WSGI 标准进行了扩展应用,提升了重用性且将功能分割到独立的模块中。Pylons 是最新的 Web 应用框架中的典型,类似于 Django 和 TurboGears。Pylons 受 Ruby on Rails 影响很深:它的两个组件,Routes 和 WebHelpers 是 Rails 特性的 Python 实现。</p>
<p>缺 点:Pylons 已与 repoze.bfg 合并,现在处于仅维护模式。强烈建议新项目从新合并的 Web 框架金字塔开始。</p>
<p>![Image](data:image/svg+xml,%3C%3Fxml version=’1.0’ encoding=’UTF-8’%3F%3E%3Csvg width=’1px’ height=’1px’ viewBox=’0 0 1 1’ version=’1.1’ xmlns=’<a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a>‘ xmlns:xlink=’<a href="http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg">http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg</a> stroke=’none’ stroke-width=’1’ fill=’none’ fill-rule=’evenodd’ fill-opacity=’0’%3E%3Cg transform=’translate(-249.000000, -126.000000)’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)</p>
<h2 id="35-Cubes-框架"><a href="#35-Cubes-框架" class="headerlink" title="35. Cubes 框架"></a><a href="#35-Cubes-%E6%A1%86%E6%9E%B6" title="35. Cubes 框架"></a><strong>35. Cubes 框架</strong></h2><p>官 网:</p>
<p><a href="https://pythonhosted.org/cubes/">https://pythonhosted.org/cubes/</a></p>
<p>优 点:Cubes 是一个轻量级的 Python 框架和工具集,用于开发报告和分析应用程序、在线分析处理 (OLAP)、多维分析和浏览聚合数据。它是 Data Brewery 的一部分。</p>
<p>缺点:不再为每个多维数据集提供隐式聚合 record_count。它必须明确定义为聚合:旧的后端架构是有限制的。它只允许使用一个商店,必须在服务器启动之前知道模型,不可能从远程来源获取模型。</p>
<h2 id="36-Dpark-框架"><a href="#36-Dpark-框架" class="headerlink" title="36. Dpark 框架"></a><a href="#36-Dpark-%E6%A1%86%E6%9E%B6" title="36. Dpark 框架"></a><strong>36. Dpark 框架</strong></h2><p>官 网:</p>
<p><a href="https://github.com/Liangchengdeye/Dpark">https://github.com/Liangchengdeye/Dpark</a></p>
<p>优 点:DPark 是 Spark 的 Python 克隆版本,是一个 Python 实现的分布式计算框架,可以非常方便地实现大规模数据处理和低延时的迭代计算。该计算框架类似于 MapReduce,但是比其更灵活,可以用 Python 非常方便地进行分布式计算,并且提供了更多的功能,以便更好地进行迭代式计算。DPark 由国内的豆瓣公司开发实现和负责维护,据豆瓣公司的描述,目前豆瓣公司内部的绝大多数数据分析都使用 DPark 完成,整个项目也正趋于完善。</p>
<p>缺 点:Dpark 使用的是进程,在 Python 中,由于 GIL (Global Interpreter Lock) 的存在,即使在多核机器上使用多个线程,这些线程之间也没有办法真正地实现并发执行。</p>
<h2 id="37-Buildbot-框架"><a href="#37-Buildbot-框架" class="headerlink" title="37. Buildbot 框架"></a><a href="#37-Buildbot-%E6%A1%86%E6%9E%B6" title="37. Buildbot 框架"></a><strong>37. Buildbot 框架</strong></h2><p>官 网:</p>
<p><a href="https://buildbot.python.org/all/#/">https://buildbot.python.org/all/#/</a></p>
<p>优 点:Buildbot 是 python 实现的开源持续构建和持续交付工具,为 Python, Mozilla, Chromium, WebKit 等知名项目使用。Buildbot 可以直接使用 python 包,轻松拥有上万库,具备强大的扩展能力。如果你觉得 Jenkins 已经轻松地满足你的需求,你不需要 Buildbot。如果你在 Jenkins 时觉得效率低下、扩展困难、一些用 python 等脚本可以实现的动作在 Jenkins 困难重重,那么可以看看 Buildbot。</p>
<p>缺 点:buildbot 对多项目支持并不好。</p>
<p>引用链接:<a href="https://mp.weixin.qq.com/s/0b_bG83S-LEpQOtaWZXv3A">https://mp.weixin.qq.com/s/0b_bG83S-LEpQOtaWZXv3A</a></p>
]]></content>
<categories>
<category>技术</category>
<category>数据分析</category>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
<tag>网站</tag>
</tags>
</entry>
<entry>
<title>Hadoop、Spark、Flink简单概要</title>