-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
5650 lines (5518 loc) · 429 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>3月5日 学习记录</title>
<url>/2023/03/05/3%E6%9C%885%E6%97%A5%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</url>
<content><![CDATA[<h4 id="flask中函数app-route-嵌套装饰器可能错误"><a href="#flask中函数app-route-嵌套装饰器可能错误" class="headerlink" title="flask中函数app.route()嵌套装饰器可能错误"></a>flask中函数app.route()嵌套装饰器可能错误</h4><hr>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">atuh1</span>(<span class="params">func</span>):</span><br><span class="line"><span class="meta"> @functools.wraps(<span class="params">func</span>)</span></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">inner</span>(<span class="params">*arg, **kwarg</span>):</span><br><span class="line"> <span class="keyword">return</span> func(*arg, **kwarg)</span><br><span class="line"> <span class="keyword">return</span> inner</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">atuh2</span>(<span class="params">func</span>):</span><br><span class="line"><span class="meta"> @functools.wraps(<span class="params">func</span>)</span></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">inner</span>(<span class="params">*arg, **kwarg</span>):</span><br><span class="line"> <span class="keyword">return</span> func(*arg, **kwarg)</span><br><span class="line"> <span class="keyword">return</span> inner </span><br><span class="line"></span><br><span class="line"><span class="meta">@auth1</span></span><br><span class="line"><span class="meta">@auth2</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"index"</span>)</span><br></pre></td></tr></table></figure></div>
<p>单装饰器装饰: 装饰器在装饰一个函数时,此函数将被装饰器内部函数替代,如果想暴露原本函数,可以使用装饰器@functools.wraps(func)</p>
<p>多装饰器装饰: 优先使用内部装饰器,逐层向上</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line">app = Flask(__name__)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">"/index"</span></span>)</span></span><br><span class="line"><span class="meta">@auth</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"h"</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">"/login"</span></span>)</span></span><br><span class="line"><span class="meta">@auth</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">login</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"g"</span></span><br></pre></td></tr></table></figure></div>
<p>@app.route() endpoint默认为函数名 </p>
<p>两个函数使用相同函数装饰auth, 在不使用@functools.warps(func)的情况下,两个初始函数被装饰后,都将变为inner的属性,形成别名重复错误:<br><code>AssertionError: View function mapping is ovwewriting an existing endpoint function: inner</code></p>
<h4 id="flask蓝图"><a href="#flask蓝图" class="headerlink" title="flask蓝图"></a>flask蓝图</h4><hr>
<p>flask蓝图主要功能就是分类(Blueprint),不同功能函数放在不同文件中实现: </p>
<ol>
<li><p>创建蓝图</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">xxx = Blueprint(<span class="string">'xxx'</span>, __name__)</span><br></pre></td></tr></table></figure></div>
</li>
<li><p>在主进程中引用蓝图</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> <span class="string">'/path'</span> <span class="keyword">import</span> xxx</span><br><span class="line">app.register_blueprint(xxx, url_prefix=<span class="string">'/x'</span>)</span><br></pre></td></tr></table></figure></div>
<p>url_prefix 添加前缀 使用: /x/xxx</p>
</li>
</ol>
<h4 id="Django的路由映射和Flask的蓝图有什么区别"><a href="#Django的路由映射和Flask的蓝图有什么区别" class="headerlink" title="Django的路由映射和Flask的蓝图有什么区别"></a>Django的路由映射和Flask的蓝图有什么区别</h4><hr>
<p>flask:</p>
<ol>
<li><p>flask是利用蓝图进行模块划分的,通过app装饰器注册模块蓝图,在主模块统一调用;</p>
</li>
<li><p>在flask中,路由是通过装饰器给每个视图函数提供的, 而且根据请求方式的不同可以一个url用于不同的作用。功能相似,但是底层实现不一样</p>
</li>
</ol>
<p>Django:</p>
<ol>
<li>Django路由映射是通过路由正则匹配映射到每一个模块的</li>
<li>在django中,路由是浏览器访问服务器时,先访问的项目中的url,再由项目中的url找到应用中url,这些url是放在一个列表里,遵从从前往后匹配的规则。</li>
</ol>
]]></content>
<tags>
<tag>Flask Study</tag>
</tags>
</entry>
<entry>
<title>3月6日 学习记录</title>
<url>/2023/03/06/3%E6%9C%886%E6%97%A5%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</url>
<content><![CDATA[<h3 id="唯一的URL-x2F-重定向行为"><a href="#唯一的URL-x2F-重定向行为" class="headerlink" title="唯一的URL/重定向行为"></a>唯一的URL/重定向行为</h3><hr>
<p>route内的元素表示不同,将有不同的限制</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/projects/'</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">projects</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'a'</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/about'</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">about</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'b'</span></span><br></pre></td></tr></table></figure></div>
<p>如果使用没有斜杠的/projects访问,Flask会自动帮助添加斜杠,因此中规中矩,却有两种访问方式。 </p>
<p>如果使用有斜杠的/about/访问,将会返回一个404未找到错误,可以保证URL唯一性,并有助于搜索引擎重复索引同一个界面!</p>
<h3 id="flask的session"><a href="#flask的session" class="headerlink" title="flask的session"></a>flask的session</h3><hr>
<p>flask的session是以加密保存在浏览器上的,依赖于secret_key</p>
<h3 id="数据库连接池"><a href="#数据库连接池" class="headerlink" title="数据库连接池"></a>数据库连接池</h3><hr>
<p>使用数据库连接池可以很好的解决链接数据库时,重复连接的问题</p>
<p>可以将数据库连接封装成一个函数或者类,方便调用</p>
<h4 id="With上下文管理-简"><a href="#With上下文管理-简" class="headerlink" title="With上下文管理(简)"></a>With上下文管理(简)</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Foo</span>(<span class="title class_ inherited__">object</span>):</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__enter__</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="number">124</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__exit__</span>(<span class="params">self, exc_type, exc_val</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line">obj = Foo()</span><br><span class="line"><span class="keyword">with</span> obj <span class="keyword">as</span> f:</span><br><span class="line"> <span class="built_in">print</span>(f)</span><br></pre></td></tr></table></figure></div>
<p>with一个对象会调用对象中的 属性__enter__ ,结束后调用属性__exit__。</p>
<p>使用上下文管理操控线程池的开关,可以实现线程自动化</p>
<h3 id="引入静态文件"><a href="#引入静态文件" class="headerlink" title="引入静态文件"></a>引入静态文件</h3><hr>
<div class="highlight-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">{{</span> <span class="attr">url_for</span>('<span class="attr">static</span>', <span class="attr">filename</span>=<span class="string">'mm.jpg'</span>) }} /></span></span><br></pre></td></tr></table></figure></div>
<p>或</p>
<div class="highlight-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'/static/mm.jpg'</span> /></span></span><br></pre></td></tr></table></figure></div>
<p>在使用static_url_path=’/xx’修改static文件夹路径时,前一个可以在不做修改下实现自动识别static路径。后者需要一个一个修改,不利于使用。</p>
<h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><hr>
<p>使用函数加载配置文件:</p>
<p><code>app.config.from_object('config.settings')</code></p>
<p>使用配置文件:</p>
<p><code>app.config['xx']</code></p>
<ol>
<li><p>可以使用localsettings在本地测试, 覆盖settings, 保护原始文件</p>
<p>在settings添加:</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">from</span> localsettings <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">except</span> ImportError:</span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure></div></li>
</ol>
<p> 在上传服务器时,可以方便的在服务器和本地切换</p>
<p> 使用.gitgnore控制上传文件,忽略不需要的文件</p>
<ol start="2">
<li><p>类配置文件</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Dev</span>(<span class="title class_ inherited__">obj</span>):</span><br><span class="line"> HOST = <span class="number">1.1</span><span class="number">.1</span><span class="number">.1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Prod</span>(<span class="title class_ inherited__">obj</span>):</span><br><span class="line"> HOST = <span class="number">1.1</span><span class="number">.1</span><span class="number">.1</span></span><br></pre></td></tr></table></figure></div></li>
</ol>
<p> 使用类隔离开发环境</p>
<h3 id="小知识"><a href="#小知识" class="headerlink" title="小知识"></a>小知识</h3><hr>
<ol>
<li><p>进程是cpu中执行的最小单元,线程是cpu中资源调度的最小单元,一个进程内可以有多个线程</p>
</li>
<li><p>接口<br>其他语言 :<br>接口是以interface关键字开头,内部定义方法,但不具体实现,专门用于约束实现类<br>类中可以有多个接口继承 </p>
<p>python :<br>无接口,可以多继承<br>但不能继承多个类</p>
</li>
<li><p>构造函数和析构函数<br>构造函数:用于创建对象的函数 class foo(obj)<br>析构函数:用于销毁对象的函数 del obj()</p>
</li>
<li><p>重写和重载的区别<br>重载:函数名相同而参数类型,个数,返回值不同<br>重写:在子类中,对父类的方法重写</p>
</li>
<li><p>抽象类和抽象方法<br>java :<br>抽象类中可以有抽象方法也可以有普通方法。<br>抽象类被继承后需要实现抽象方法</p>
</li>
</ol>
]]></content>
<tags>
<tag>Flask Study</tag>
</tags>
</entry>
<entry>
<title>3月7日学习记录</title>
<url>/2023/03/07/3%E6%9C%887%E6%97%A5%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</url>
<content><![CDATA[<h3 id="路由系统"><a href="#路由系统" class="headerlink" title="路由系统"></a>路由系统</h3><hr>
<h4 id="路由的两种写法"><a href="#路由的两种写法" class="headerlink" title="路由的两种写法"></a>路由的两种写法</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">app.add_url_rule(<span class="string">'/index'</span>, <span class="string">'index'</span>, index)</span><br></pre></td></tr></table></figure></div>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/inddex'</span></span>)</span></span><br></pre></td></tr></table></figure></div>
<h4 id="路由加载源码的流程"><a href="#路由加载源码的流程" class="headerlink" title="路由加载源码的流程"></a>路由加载源码的流程</h4><ul>
<li><p>将URL和函数打包成为Rule对象</p>
</li>
<li><p>将Rule对象添加到map对象中</p>
</li>
<li><p>app_url_map = map对象</p>
</li>
</ul>
<h4 id="动态路由"><a href="#动态路由" class="headerlink" title="动态路由"></a>动态路由</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/index/<string:name>'</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>(<span class="params">name</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">f'<span class="subst">{name}</span>'</span></span><br></pre></td></tr></table></figure></div>
<p>uuid类型 类似于xxxxx-xxxxxxx-xxxxxx-xxxxxx</p>
<h5 id="自定义路由"><a href="#自定义路由" class="headerlink" title="自定义路由"></a>自定义路由</h5><p>必须继承BaseConverter</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> werkzeug.routing <span class="keyword">import</span> BaseConverter</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RegexConverter</span>(<span class="title class_ inherited__">BaseConverter</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, <span class="built_in">map</span>, regex</span>):</span><br><span class="line"> <span class="built_in">super</span>().__init__(<span class="built_in">map</span>)</span><br><span class="line"> self.regex = regex</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">to_python</span>(<span class="params">self, value</span>):</span><br><span class="line"> <span class="keyword">return</span> value</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">app.url_map.converters[<span class="string">'regex'</span>] = RegexConverter</span><br></pre></td></tr></table></figure></div>
<h3 id><a href="#" class="headerlink" title></a></h3><h3 id="视图"><a href="#视图" class="headerlink" title="视图"></a>视图</h3><hr>
<h4 id="FBV"><a href="#FBV" class="headerlink" title="FBV"></a>FBV</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/user'</span>, method=[<span class="string">'GET'</span>, <span class="string">'POST'</span>]</span>)</span></span><br></pre></td></tr></table></figure></div>
<h4 id="CBV"><a href="#CBV" class="headerlink" title="CBV"></a>CBV</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">UserView</span>(views, MethodView):</span><br><span class="line"> method = [<span class="string">'GET'</span>, <span class="string">'POST'</span>]</span><br><span class="line"> decorators = [test1, test2] //CBV添加装饰器</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'get'</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">post</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'post'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">app.add_url_rule(<span class="string">'/user'</span>, view_func=UserView.as_view(<span class="string">'user'</span>))</span><br></pre></td></tr></table></figure></div>
<h3 id="模板-jinja2"><a href="#模板-jinja2" class="headerlink" title="模板(jinja2)"></a>模板(jinja2)</h3><hr>
<h4 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h4><p>模板可继承</p>
<ol>
<li><p>被继承:</p>
<p><code>{% block content %} ? {% endbloack %}</code> </p>
</li>
<li><p>继承:</p>
<p><code>{% extends 'layout.html' %} {% block content %} ? {% endbloack %}</code></p>
</li>
<li><p>引入:</p>
<p><code>{% include 'from.html' %}</code></p>
</li>
</ol>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">dunc</span>(<span class="params">arg</span>):</span><br><span class="line"> <span class="keyword">return</span> arg</span><br><span class="line"></span><br><span class="line">render_template(<span class="string">'md.html'</span>, nums=nums, f=func) //可以传递函数名</span><br></pre></td></tr></table></figure></div>
<p>定义全局模板方法</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.template_glabol() //模板中全局使用 {{ func(<span class="params"><span class="string">'haha'</span></span>) }}</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func</span>(<span class="params">arg</span>):</span><br><span class="line"> <span class="keyword">return</span> arg</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.template_filter() //模板全局使用 {{ <span class="string">'haha'</span>|f(<span class="params"><span class="string">'e'</span></span>) }}</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f</span>(<span class="params">arg,h</span>):</span><br><span class="line"> <span class="keyword">return</span> arg + h</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/md/hg'</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line"> <span class="keyword">return</span> render_template(<span class="string">'md_hg.html'</span>)</span><br></pre></td></tr></table></figure></div>
<p>如果想要将一个方法限制为一个蓝图域中使用,只需将app修改即可</p>
<h3 id="特殊装饰器"><a href="#特殊装饰器" class="headerlink" title="特殊装饰器"></a>特殊装饰器</h3><hr>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@app.before_request //视图函数运行前运行</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f1</span>():// 一旦返回值为真,则停止行为向下传播(判断用户登录等), 反之空,则继续</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'f1'</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.after_request //视图函数运行结束后运行</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f2</span>(<span class="params">response</span>): //视图函数有返回值,就必须返回一个Responce</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'f2'</span>)</span><br><span class="line"> <span class="keyword">return</span> response</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">'/index'</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line"> <span class="keyword">return</span> render_template(<span class="string">'index.html'</span>)</span><br></pre></td></tr></table></figure></div>
<p>或</p>
<p><code>app.before_request(func)</code>不加装饰器使用</p>
]]></content>
<tags>
<tag>Flask Study</tag>
</tags>
</entry>
<entry>
<title>3月9日项目问题</title>
<url>/2023/03/09/3%E6%9C%889%E6%97%A5%E9%A1%B9%E7%9B%AE%E9%97%AE%E9%A2%98/</url>
<content><![CDATA[<h4 id="读取yaml"><a href="#读取yaml" class="headerlink" title="读取yaml"></a>读取yaml</h4><p>引用<code>from ruamel import yaml</code></p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">yaml.load(</span><br><span class="line"> Path(<span class="string">'C:\\Users\\Lenovo\\Desktop\\bot\\IntBot\\configs\\config.yaml'</span>).read_text(encoding=<span class="string">'utf-8'</span>),</span><br><span class="line"> Loader=yaml.Loader</span><br><span class="line">)</span><br></pre></td></tr></table></figure></div>
<h4 id="pydantic"><a href="#pydantic" class="headerlink" title="pydantic"></a>pydantic</h4><p><code>extra='ignore'</code>忽略额外属性</p>
<h3 id="flask-migrate数据迁移"><a href="#flask-migrate数据迁移" class="headerlink" title="flask-migrate数据迁移"></a>flask-migrate数据迁移</h3><p>因为在开发中,由于数据表模型的改动,数据经常被清除,因此可以使用数据迁移,保存旧数据</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line"><span class="keyword">from</span> flask_sqlalchemy <span class="keyword">import</span> SQLAlchemy</span><br><span class="line"><span class="keyword">from</span> flask_migrate <span class="keyword">import</span> Migrate</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line"><span class="comment"># 设置数据库连接地址</span></span><br><span class="line">DB_URI = <span class="string">'mysql+pymysql://root:[email protected]:3306/web'</span></span><br><span class="line">app.config[<span class="string">'SQLALCHEMY_DATABASE_URI'</span>] = DB_URI</span><br><span class="line"><span class="comment"># 是否追踪数据库修改,一般不开启, 会影响性能</span></span><br><span class="line">app.config[<span class="string">'SQLALCHEMY_TRACK_MODIFICATIONS'</span>] = <span class="literal">False</span></span><br><span class="line"><span class="comment"># 是否显示底层执行的SQL语句</span></span><br><span class="line">app.config[<span class="string">'SQLALCHEMY_ECHO'</span>] = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化db,关联flask 项目</span></span><br><span class="line">db = SQLAlchemy(app)</span><br><span class="line"><span class="comment"># 迁移组件初始化</span></span><br><span class="line">Migrate(app, db)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建模型</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Students</span>(db.Model):</span><br><span class="line"> __tablename__ = <span class="string">'students'</span> <span class="comment"># 数据库表名</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">id</span> = db.Column(db.Integer, primary_key=<span class="literal">True</span>)</span><br><span class="line"> name = db.Column(db.String(<span class="number">20</span>))</span><br><span class="line"> fullname = db.Column(db.String(<span class="number">30</span>))</span><br><span class="line"> nickname = db.Column(db.String(<span class="number">30</span>))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__repr__</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"<Students(name='<span class="subst">{self.name}</span>', fullname='<span class="subst">{self.fullname}</span>', nickname='<span class="subst">{self.nickname}</span>')>"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Users</span>(db.Model):</span><br><span class="line"> __tablename__ = <span class="string">'user'</span> <span class="comment"># 数据库表名</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">id</span> = db.Column(db.Integer, primary_key=<span class="literal">True</span>)</span><br><span class="line"> name = db.Column(db.String(<span class="number">30</span>))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__repr__</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"<Users(id='<span class="subst">{self.<span class="built_in">id</span>}</span>', name='<span class="subst">{self.name}</span>')>"</span></span><br></pre></td></tr></table></figure></div>
<p>执行迁移命令,先设置环境变量, 如果启动文件是app.py 这步可以省略。</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">set</span> FLASK_APP=app.py <span class="comment"># 设置环境变量指定启动文件</span></span><br></pre></td></tr></table></figure></div>
<p>windows用set设置环境变量,linux 用export 设置环境变量</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">export</span> FLASK_APP=app.py <span class="comment"># 设置环境变量指定启动文件</span></span><br></pre></td></tr></table></figure></div>
<p>执行相关命令</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line">flask db init <span class="comment"># 生成迁移文件夹 只执行一次</span></span><br><span class="line">flask db migrate <span class="comment"># ⽣成迁移版本, 保存到迁移文件夹中</span></span><br><span class="line">flask db upgrade <span class="comment"># 执行迁移</span></span><br></pre></td></tr></table></figure></div>
<h4 id="迁移命令"><a href="#迁移命令" class="headerlink" title="迁移命令"></a>迁移命令</h4><p>init 命令执行后,会生成migrations目录</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line">flask db init</span><br></pre></td></tr></table></figure></div>
<p>migrate 命令生成迁移脚本,保存到迁移文件夹中versions目录</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line">flask db migrate</span><br></pre></td></tr></table></figure></div>
<p>upgrade 命令执行迁移</p>
<div class="highlight-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="code"><pre><span class="line">flask db upgrade</span><br></pre></td></tr></table></figure></div>
<p>执行完upgrade 命令才会在数据库中生成表</p>
<h3 id="虚拟环境直接复制迁移"><a href="#虚拟环境直接复制迁移" class="headerlink" title="虚拟环境直接复制迁移"></a>虚拟环境直接复制迁移</h3><ol>
<li><p>迁移到新电脑,将 虚拟环境文件夹内的pyvenv.cfg文件中home参数,写成新电脑python的路径</p>
</li>
<li><p>修改虚拟环境文件夹中Scripts中的activate内VIRTUAL_ENV参数修改成新电脑虚拟环境文件夹路径</p>
</li>
<li><p>修改虚拟文件夹中Scripts中的activate.bat内set “VIRTUAL_ENV参数改成新电脑虚拟环境文件夹路径</p>
</li>
</ol>
]]></content>
<tags>
<tag>Project</tag>
</tags>
</entry>
<entry>
<title>Django</title>
<url>/2023/03/25/Django/</url>
<content><![CDATA[<h3 id="Django-MVT"><a href="#Django-MVT" class="headerlink" title="Django MVT"></a>Django MVT</h3><ul>
<li><p>网站设计的三层架构</p>
</li>
<li><p>借鉴于Java的MVC(C: Controller)</p>
</li>
</ul>
<p>M(Model数据模型: 数据层)V(View视图层: 控制层)T(Templete模板层(在MVC中为视图层))</p>
<p><img lazyload src="/images/loading.svg" data-src="C:\Users\Lenovo\AppData\Roaming\marktext\images\2023-03-25-12-39-38-image.png"></p>
<h3 id="创建Django工程文件"><a href="#创建Django工程文件" class="headerlink" title="创建Django工程文件"></a>创建Django工程文件</h3><p>django-admin startproject 文件名</p>
<p>内部生成文件</p>
<ul>
<li><p>manage.py 内置django命令</p>
</li>
<li><p>settings 配置文件</p>
</li>
<li><p>urls 路由文件</p>
</li>
<li><p>wsgi 网关系统 在互联网中可以被其他计算机访问的文件</p>
</li>
</ul>
<h3 id="运行Django工程"><a href="#运行Django工程" class="headerlink" title="运行Django工程"></a>运行Django工程</h3><p>manage.py 内置测试服务器运行指令</p>
<p>python3 manage.py runserver (默认8000端口)</p>
<h3 id="创建子应用"><a href="#创建子应用" class="headerlink" title="创建子应用"></a>创建子应用</h3><p>python3 manage.py startapp 应用名</p>
<p>内部生成文件</p>
<ul>
<li><p>admin.py 与网站后台管理站点配置相关</p>
</li>
<li><p>apps.py 用于配置当前子应用的相关信息</p>
</li>
<li><p>mifrations 用于存储数据库迁移历史文件</p>
</li>
<li><p>models.py 用户保存数据库模型类</p>
</li>
<li><p>tests.py 用于开发测试用例,编写单元测试</p>
</li>
<li><p>views.py 用于编写web应用视图</p>
</li>
</ul>
<h3 id="Setting配置"><a href="#Setting配置" class="headerlink" title="Setting配置"></a>Setting配置</h3><ul>
<li><p>ALLOWED_HOSTS = [‘*’] 允许访问的主机</p>
</li>
<li><p>INSTALLED_APPS = [‘app’] 应用注册,app在创建后在此注册应用</p>
</li>
</ul>
<h3 id="外键的优缺点"><a href="#外键的优缺点" class="headerlink" title="外键的优缺点"></a>外键的优缺点</h3><h4 id="优点"><a href="#优点" class="headerlink" title="优点:"></a>优点:</h4><ul>
<li><p>由数据库自身保证数据一致性和完整性,数据更可靠</p>
</li>
<li><p>可以增加ER图的可读性</p>
</li>
<li><p>外键可以节省开发量</p>
</li>
</ul>
<h4 id="缺点"><a href="#缺点" class="headerlink" title="缺点:"></a>缺点:</h4><ul>
<li><p>性能确实,有额外的开销</p>
</li>
<li><p>主键表被锁定时,会引发外键表也被锁</p>
</li>
<li><p>删除主键表的数据时,需先删除外键表的数据</p>
</li>
<li><p>修改外键表字段时,需重建外键约束</p>
</li>
<li><p>不能用于分布式环境</p>
</li>
<li><p>不容易做到数据解耦</p>
</li>
</ul>
<h4 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h4><ul>
<li><p>适用</p>
<p>内部系统,传统企业级,规模可控的环境</p>
</li>
<li><p>不适用</p>
<p>规模不可控的环境, 数量大</p>
</li>
</ul>
<p>on_delete:</p>
<ul>
<li><p>models.SET_NULL<br>置空模式,删除时,外键字段被设置为空,前提就是blank=True, null=True,定义该字段时,允许为空。理解:删除关联数据(子表),与之关联的值设置默认值为null(父表中),这个前提需要父表中的字段可以为空。<br>PS:外键写在多处,且写外键只能是主键,如没设置主键,django会自动帮你创</p>
</li>
<li><p>None:<br>删除关联表的数据时,当前表与关联表的filed的行为。</p>
</li>
<li><p>models.CASCADE:<br>表示级联删除,当关联表(子表)中的数据删除时,与其相对应的外键(父表)中的数据也删除。</p>
</li>
<li><p>models.DO_NOTHING:<br>你删你的,父亲(外键)不想管你</p>
</li>
<li><p>models.PROTECT:<br>保护模式,如采用这个方法,在删除关联数据时会抛出ProtectError错误</p>
</li>
<li><p>models.SET_DEFAULT:<br>设置默认值,删除子表字段时,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。</p>
</li>
<li><p>on_delete = models.SET(值):<br>删除关联数据时,自定义一个值,该值只能是对应指定的实体</p>
</li>
</ul>
<h3 id="视图"><a href="#视图" class="headerlink" title="视图"></a>视图</h3><ol>
<li><p>视图函数必须定义一个参数(通常命名为request)</p>
<ul>
<li>request: 用来接收客户端的请求信息的</li>
</ul>
</li>
<li><p>视图函数的返回值必须是一个HttpResponse的对象</p>
</li>
</ol>
<h4 id="视图使用的流程"><a href="#视图使用的流程" class="headerlink" title="视图使用的流程"></a>视图使用的流程</h4><ol>
<li><p>在应用的views.py定义视图函数</p>
</li>
<li><p>配置路由</p>
<ul>
<li><p>在项目目录的urls.py中关联应用下的urls.py</p>
</li>
<li><p>在应用的目录下定义一个urls.py文件</p>
</li>
<li><p>配置具体的访问规则</p>
<p><code>urlpatterns = [path('路由名', 包路径)]</code></p>
</li>
</ul>
</li>
</ol>
<h3 id="admin-Django默认后台"><a href="#admin-Django默认后台" class="headerlink" title="admin Django默认后台"></a>admin Django默认后台</h3><ol>
<li><p>配置admin账户密码</p>
<ul>
<li><code>python manage.py createsuperuser</code></li>
</ul>
</li>
</ol>
<h3 id="模板"><a href="#模板" class="headerlink" title="模板"></a>模板</h3><h4 id="模板的配置和使用步骤"><a href="#模板的配置和使用步骤" class="headerlink" title="模板的配置和使用步骤:"></a>模板的配置和使用步骤:</h4><ol>
<li><p>在项目目录下创建一个templates文件夹</p>
</li>
<li><p>在setting.py中TEMPLATES选项中配置项目模板的根路径</p>
<p><code>'DIRS': [BASE_DIR / 'templates']</code></p>
</li>
<li><p>在templates中创建和应用同名文件夹</p>
</li>
<li><p>在templates下应用同名的文件夹中创建html模板页面</p>
</li>
<li><p>在views.py中定义视图函数, 并返回html模板页面</p>
<ul>
<li><p>参数:</p>
<ul>
<li><p>第一个请求对象</p>
</li>
<li><p>第二个模板路径</p>
</li>
<li><p>第三个要渲染到模板中的数据(必须是字典)</p>
</li>
</ul>
</li>
</ul>
<p><code>return render(request, 'news/list.html', info)</code></p>
</li>
<li><p>配置路由访问规则</p>
</li>
</ol>
<h3 id="修改数据库为MySQL"><a href="#修改数据库为MySQL" class="headerlink" title="修改数据库为MySQL"></a>修改数据库为MySQL</h3><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 修改为:</span></span><br><span class="line">DATABASES = {</span><br><span class="line"> <span class="string">'default'</span>: {</span><br><span class="line"> <span class="string">'ENGINE'</span>: <span class="string">'django.db.backends.mysql'</span>,</span><br><span class="line"> <span class="string">'NAME'</span>: <span class="string">''</span>,</span><br><span class="line"> <span class="string">'USER'</span>:<span class="string">""</span>,</span><br><span class="line"> <span class="string">'PASSWORD'</span>:<span class="string">""</span>,</span><br><span class="line"> <span class="string">'HOST'</span>:<span class="string">"127.0.0.1"</span>,</span><br><span class="line"> <span class="string">'PORT'</span>: <span class="number">3306</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div>
<h3 id="创建模型"><a href="#创建模型" class="headerlink" title="创建模型"></a>创建模型</h3><ol>
<li><p>调用<code>from Django.db import models</code></p>
</li>
<li><p>创建模型类<code>class 模型名(models.Model)</code></p>
</li>
<li><p>设置属性</p>
</li>
<li><p>表名自定义:</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">模型名</span>(models.Model):</span><br><span class="line"> <span class="keyword">class</span> <span class="title class_">Meta</span>:</span><br><span class="line"> <span class="comment"># set the table's name</span></span><br><span class="line"> db_table = <span class="string">'newinfo'</span></span><br><span class="line"> <span class="comment"># set the table's info</span></span><br><span class="line"> verbose_name = <span class="string">"new's info"</span></span><br></pre></td></tr></table></figure></div></li>
</ol>
<h3 id="模型表迁移"><a href="#模型表迁移" class="headerlink" title="模型表迁移"></a>模型表迁移</h3><p><code>python manage.py makemigration</code></p>
<p><code>python manage.py migrate</code></p>
<h3 id="自定义admin后台"><a href="#自定义admin后台" class="headerlink" title="自定义admin后台"></a>自定义admin后台</h3><ol>
<li><p>进入admin.py</p>
</li>
<li><p>新建类<code>class admin类(admin.ModelAdmin)</code></p>
</li>
<li><p>将模型中的属性都放入admin类中的list_display中</p>
<p><code>list_display = ['id', 'name']</code></p>
</li>
<li><p>注册绑定类<code>admin.site.register(模型名,admin模型名)</code></p>
</li>
</ol>
<h3 id="模型类的查询方法"><a href="#模型类的查询方法" class="headerlink" title="模型类的查询方法"></a>模型类的查询方法</h3><h4 id="精确查询"><a href="#精确查询" class="headerlink" title="精确查询"></a>精确查询</h4><ul>
<li><p>get方法: 查询一条数据</p>
<p>查询id为1的数据</p>
<p><code>NewsType.object.get(id=1)</code></p>
<p>特点: 只能查询唯一满足条件的数据</p>
<blockquote>
<p>没有找到符合条件的数据,直接报错(DoesNotExist)</p>
<p>查询出多条符合条件数据,也会报错(MultipleObjectReturned)</p>
</blockquote>
</li>
<li><p>filter方法: 根据条件过滤查询</p>
<blockquote>
<p>返回的值是一个quertSet对象(查询集)</p>
</blockquote>
</li>
<li><p>all方法: 返回模块类对应的表中所有数据</p>
<blockquote>
<p>返回的值是一个querSet对象(查询集)</p>
</blockquote>
</li>
<li><p>exclude方法: 查询不符合条件的数据</p>
<p>查询name不是实时政治的</p>
<p><code>NewsType.object.exclude(name='实时政治')</code></p>
</li>
<li><p>order_by: 排序方法</p>
<p>根据新闻的阅读量进行排序(升序)</p>
<p><code>NewsInfo.object.all().order_by('read')</code></p>
<p>(降序)</p>
<p><code>NewsInfo.object.all().order_by('-read')</code></p>
<ul>
<li><p>排序规则:</p>
<blockquote>
<p>默认是从小到大(升序)</p>
<p>降序排序在字段前面加一个’-‘</p>
</blockquote>
</li>
</ul>
</li>
<li><p>查询集:</p>
<ul>
<li><p>支持索引取值</p>
</li>
<li><p>支持切片</p>
</li>
<li><p>支持再次调用查询方法</p>
</li>
</ul>
</li>
</ul>
<h4 id="模糊查询"><a href="#模糊查询" class="headerlink" title="模糊查询"></a>模糊查询</h4><p>条件语法格式:</p>
<ul>
<li>模型类.object.filter(模型类属性名__条件名=值)</li>
</ul>
<blockquote>
<ul>
<li>包含: contains</li>
</ul>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查询名称里包含'娱乐'的新闻类别</span></span><br><span class="line">NewsInfo.objects.<span class="built_in">filter</span>(new_type__contains=<span class="string">'娱乐'</span>)</span><br></pre></td></tr></table></figure></div>
<ul>
<li>开头: startswith</li>
</ul>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查询以'国'开头的新闻类别</span></span><br><span class="line">NewsInfo.objects.<span class="built_in">filter</span>(new_type__startswith=<span class="string">'国'</span>)</span><br></pre></td></tr></table></figure></div>
<ul>
<li>结尾: endswith</li>
</ul>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查询以'资讯'结尾的新闻类别</span></span><br><span class="line">NewsInfo.objects.<span class="built_in">filter</span>(new_type__endswith=<span class="string">'资讯'</span>)</span><br></pre></td></tr></table></figure></div>
<ul>
<li>范围查询: in</li>
</ul>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 查询id为1或3或5的新闻类别</span></span><br><span class="line">NewsInfo.objects.<span class="built_in">filter</span>(id__in=[<span class="number">1</span>, <span class="number">3</span>, <span class="number">5</span>])</span><br></pre></td></tr></table></figure></div>
</blockquote>
<blockquote>
<p>比较查询</p>
<ul>
<li><p>大于: gt</p>
</li>
<li><p>小于: lt</p>
</li>
<li><p>大于等于: gte</p>
</li>
<li><p>小于等于: lte</p>
</li>
<li><p>字段值是否为Null: isnull</p>
<p>查询name不为空的字段</p>
<p><code>NewsType.objects.filter(name__isnull=False)</code></p>
</li>
</ul>
</blockquote>
<h4 id="F对象和Q对象"><a href="#F对象和Q对象" class="headerlink" title="F对象和Q对象"></a>F对象和Q对象</h4><ol>
<li><p>F对象: 用来比较查询数据的两个属性</p>
<blockquote>
<p>导入: <code>from django.db.models import F</code></p>
<p>查询 ‘阅读量’ 大于 ‘评论数量’两倍的新闻</p>
<p><code>NewsInfo.objects.filter(read__gt=F('comment')*2)</code></p>
<p>F对象查询结果可以直接进行算数运算</p>
</blockquote>
</li>
<li><p>Q对象: 逻辑查询(与或非)</p>
<blockquote>
<p>导入: <code>from django.db.models import Q</code></p>
<ol>
<li><p>逻辑与:</p>
<p>不使用Q对象:</p>
<p>查询阅读数量大于40,评论数量大于35的数据</p>
<p><code>NewsInfo.objects.filter(read__gt=40,comment__gt=35)</code></p>
<p>使用Q对象:</p>
<p><code>NewsInfo.objects.filter(Q(read__gt=40) & Q(comment__gt=35))</code></p>
</li>
<li><p>逻辑或:</p>
<p><code>NewsInfo.objects.filter(Q(read__gt=40) | Q(comment__gt=35))</code></p>
</li>
<li><p>逻辑非:</p>
<p>通过 exclude查询:</p>
<p><code>NewsType.object.exclude(name='实时政治')</code></p>
<p>通过Q对象:</p>
<p><code>NewsType.object.exclude(~Q(name='实时政治'))</code></p>
</li>
</ol>
</blockquote>
</li>
</ol>
<h4 id="模型类关联查询"><a href="#模型类关联查询" class="headerlink" title="模型类关联查询"></a>模型类关联查询</h4><ol>
<li><p>通过对象进行关联查询</p>
<p><code>单一查询.模型类名_set.操作()</code></p>
<p>由一到多的查询:</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">b = BookInfo.objects.get(<span class="built_in">id</span>=<span class="number">1</span>)</span><br><span class="line">b.hero_set.<span class="built_in">all</span>()</span><br></pre></td></tr></table></figure></div>
<p>由多到一的查询:</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">b = BookInfo.objects.get(<span class="built_in">id</span>=<span class="number">1</span>)</span><br><span class="line">b.book <span class="comment"># 属性名</span></span><br></pre></td></tr></table></figure></div>
</li>
<li><p>通过模型类进行关联查询</p>
<p>由一到多的查询:</p>
<p><code>关联模型类名小写__属性__比较方法 = 值</code></p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">Book.objects.<span class="built_in">filter</span>(hero__name__contains=<span class="string">'峰'</span>)</span><br></pre></td></tr></table></figure></div>
<p>由多到一的查询:</p>
<p><code>关联字段__属性__条件运算符 = 值</code></p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">Hero.objects.<span class="built_in">filter</span>(book__name=<span class="string">'天龙八部'</span>)</span><br></pre></td></tr></table></figure></div></li>
</ol>
<h3 id="增删改操作"><a href="#增删改操作" class="headerlink" title="增删改操作"></a>增删改操作</h3><h4 id="添加数据"><a href="#添加数据" class="headerlink" title="添加数据"></a>添加数据</h4><blockquote>
<p>通过模型类往数据库添加数据</p>
</blockquote>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">Book.objects.create(title=<span class="string">'新闻001'</span>) <span class="comment"># 方式一</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 方式二</span></span><br><span class="line">obj = Book()</span><br><span class="line">obj.title = <span class="string">'啦啦啦'</span></span><br><span class="line">obj.save()</span><br></pre></td></tr></table></figure></div>
<h4 id="删除数据"><a href="#删除数据" class="headerlink" title="删除数据"></a>删除数据</h4><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">obj = Book.objects.get(title=<span class="string">'xxx'</span>)</span><br><span class="line">obj.delete()</span><br></pre></td></tr></table></figure></div>
<h4 id="修改数据"><a href="#修改数据" class="headerlink" title="修改数据"></a>修改数据</h4><blockquote>
<p>通过模型类修改数据</p>
</blockquote>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">obj = Book.objects.get(title=<span class="string">'xxx'</span>)</span><br><span class="line">obj.title = <span class="string">'yyy'</span></span><br><span class="line">obj.save()</span><br></pre></td></tr></table></figure></div>
<h3 id="路由"><a href="#路由" class="headerlink" title="路由"></a>路由</h3><blockquote>
<p>项目下的 urls.py 是整个项目路由匹配的入口</p>
</blockquote>
<h4 id="添加路由"><a href="#添加路由" class="headerlink" title="添加路由"></a>添加路由</h4><blockquote>
<p>将应用中的 urls.py 的引入主 urls.py</p>
</blockquote>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> path, include</span><br><span class="line">urlpatterns = [</span><br><span class="line"> path(<span class="string">'news/'</span>, include(<span class="string">'news.urls'</span>)),</span><br><span class="line"> path(<span class="string">'book/'</span>, include(<span class="string">'book.urls'</span>))</span><br><span class="line">]</span><br></pre></td></tr></table></figure></div>
<h4 id="url参数"><a href="#url参数" class="headerlink" title="url参数"></a>url参数</h4><ul>
<li><p>方式一:位置参数</p>
<blockquote>
<p>直接使用小括号,通过位置参数传递给视图</p>
</blockquote>
<ol>
<li><p>参数匹配</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">re_path(<span class="string">r'^index/(\d+)/$'</span>,views.show)</span><br></pre></td></tr></table></figure></div>
</li>
<li><p>视图中获取参数</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">request, num</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">f'aaaaa<span class="subst">{num}</span>'</span>)</span><br></pre></td></tr></table></figure></div></li>
</ol>
</li>
<li><p>方式二:关键字参数</p>
<ol>
<li><p>参数匹配</p>
<blockquote>
<p>其中 <code>?P<name1></code> 表示为这个参数定义的名称为 name1,可以是其他名称</p>
</blockquote>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">re_path(<span class="string">r'^index/(?P<name1>\d+)/$'</span>, show)</span><br></pre></td></tr></table></figure></div>
</li>
<li><p>视图中获取参数</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">request, name1</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">f'aaa<span class="subst">{name1}</span>'</span>)</span><br></pre></td></tr></table></figure></div></li>
</ol>
</li>
</ul>
<h3 id="错误视图"><a href="#错误视图" class="headerlink" title="错误视图"></a>错误视图</h3><blockquote>
<p>Django 内置处理 HTTP 错误的视图,主要错误及视图包括:</p>
<ul>
<li><p>404错误:url 匹配失败,找不到页面</p>
</li>
<li><p>500错误:server error 视图</p>
</li>
</ul>
</blockquote>
<p>如果想看到错误试图而不是调试信息,需要修改 <code>setting.py</code> 文件的 DEBUG 项</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">DEBUG = <span class="literal">False</span></span><br><span class="line">ALLOWED_HOSTS = [<span class="string">'*'</span>]</span><br></pre></td></tr></table></figure></div>
<ol>
<li><p>404错误视图配置</p>
<blockquote>
<p>将请求地址进行 url 匹配后,没有找到匹配的正则表达式,则调用 404 视图,这个视图会调用 404.html 的模板进行渲染。视图传递变量 request_path 给模板,表示导致错误的 URL</p>
</blockquote>
<ol>
<li><p>在 templates 中创建 404.html</p>
</li>
<li><p>在浏览器中访问没有定义的路由,触发错误</p>
</li>
</ol>
</li>
<li><p>500错误视图配置</p>
<blockquote>
<p>在视图中代码运行报错会发生500错误,调用内置错误视图,使用 <code>templates/500.html</code> 模板渲染</p>
</blockquote>
<ol>
<li><p>定义错误的视图</p>
</li>
<li><p>访问错误的视图</p>
</li>
</ol>
</li>
</ol>
<h3 id="HttpRequest-对象"><a href="#HttpRequest-对象" class="headerlink" title="HttpRequest 对象"></a>HttpRequest 对象</h3><ol>
<li><p>request 对象的属性</p>
<ul>
<li><p>path:表示请求的页面的完整路径,不包括域名和参数部分</p>
</li>
<li><p>method:表示请求使用的 HTTP 方法,常用值包括:’GET’, ‘POST’</p>
</li>
<li><p>encoding:表示提交的数据的编码方式</p>
</li>
<li><p>FILES:包含所有上传文件</p>
</li>
<li><p>COOKIES:包含所有的 cookie,key 和 value 都是字符串</p>
</li>
</ul>
</li>
</ol>
<h3 id="HttpResponse-对象"><a href="#HttpResponse-对象" class="headerlink" title="HttpResponse 对象"></a>HttpResponse 对象</h3><ol>
<li><p>初始化参数</p>
<ul>
<li><p>content:表示返回的内容字符串</p>
</li>
<li><p>charset:表示 response 采用的编码字符集,默认为 utf-8</p>
</li>
<li><p>status_code:返回的是HTTP响应状态码</p>
</li>
<li><p>content_type:指定返回数据的MIME类型,默认为’text/html’</p>
</li>
</ul>
</li>
</ol>
<h3 id="重定向"><a href="#重定向" class="headerlink" title="重定向"></a>重定向</h3><blockquote>
<p>当一个逻辑处理完成后,不需要向客户端呈现数据,而转到其他页面</p>
</blockquote>
<ol>
<li><p>定义视图</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.http <span class="keyword">import</span> HttpResponseRedirect</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义重定向视图</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">red</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponseRedirect(redirect_to=<span class="string">'/'</span>)</span><br></pre></td></tr></table></figure></div>
</li>
<li><p>配置 url</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">url(<span class="string">r'^red/$'</span>, views.red)</span><br></pre></td></tr></table></figure></div></li>
</ol>
<p>简写redirect</p>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render,redirect</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">red</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/'</span>)</span><br></pre></td></tr></table></figure></div>
<h3 id="类视图"><a href="#类视图" class="headerlink" title="类视图"></a>类视图</h3><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.views <span class="keyword">import</span> View</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">view</span>(<span class="title class_ inherited__">View</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get</span>(<span class="params">self, request</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">post</span>(<span class="params">self, request</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure></div>
<blockquote>
<p>在urls.py 中配置路由</p>
</blockquote>
<div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line">re_path(<span class="string">r'xxx/$'</span>, view.as_view())</span><br></pre></td></tr></table></figure></div>
<h3 id="模板-1"><a href="#模板-1" class="headerlink" title="模板"></a>模板</h3><div class="highlight-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">IndexView</span>(<span class="title class_ inherited__">View</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get</span>(<span class="params">self, request</span>):</span><br><span class="line"> context = {</span><br><span class="line"> <span class="string">'xxx'</span> = <span class="string">'xxx'</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'tempdemo/index.html'</span>, context)</span><br></pre></td></tr></table></figure></div>
<blockquote>
<p>在urls.py中配置路由</p>
</blockquote>
]]></content>
<tags>
<tag>Django Study</tag>
</tags>
</entry>
<entry>
<title>JavaScript-React-1</title>
<url>/2023/03/07/JavaScript-React-1/</url>
<content><![CDATA[<h3 id="箭头函数"><a href="#箭头函数" class="headerlink" title="箭头函数"></a>箭头函数</h3><hr>
<h4 id="限制"><a href="#限制" class="headerlink" title="限制:"></a>限制:</h4><ul>
<li><p>只有一个参数的函数 参数 => 返回值</p>
</li>
<li><p>多个参数使用括号 (a,b) => 返回值</p>
</li>
<li><p>返回值必须是一个表达式</p>
</li>
<li><p>返回值是对象必须带括号</p>
</li>
<li><p>如需写语句,在后添加代码块</p>
</li>
</ul>
<div class="note note-info icon-padding"><i class="note-icon fa-solid fa-info-circle"></i><p>隐含参数arguments-表示当前函数的实参 arguments.lenth 获取实参数。剩余参数…args</p>
</div>
<h4 id="特性"><a href="#特性" class="headerlink" title="特性:"></a>特性:</h4><ul>
<li><p>箭头函数中没有arguments,可以使用…args</p>
</li>
<li><p>箭头函数的this总是看外层作用域的this</p>
</li>
<li><p>箭头函数中的this无法通过call(), apply(), bind()修改</p>
</li>
<li><p>箭头函数无法作为构造函数,无法new</p>
</li>
</ul>
<h3 id="模块化"><a href="#模块化" class="headerlink" title="模块化"></a>模块化</h3><hr>
<div class="note note-info icon-padding"><i class="note-icon fa-solid fa-info-circle"></i><p>默认情况下,script标签中不能使用import语句,必须设置script的type属性为module</p>
</div>
<h4 id="导出"><a href="#导出" class="headerlink" title="导出:"></a>导出:</h4><ul>
<li><p>默认导出</p>
<div class="highlight-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> xxx;</span><br></pre></td></tr></table></figure></div></li>
</ul>
<p>一个模块里只有一个默认导出</p>
<ul>
<li><p>命名导出</p>
<div class="highlight-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> {a,b,c}</span><br></pre></td></tr></table></figure></div></li>
</ul>
<h4 id="导入"><a href="#导入" class="headerlink" title="导入:"></a>导入:</h4><ul>
<li><p>默认导入</p>
<div class="highlight-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> xxx <span class="keyword">from</span> <span class="string">'./m1.js'</span>;</span><br></pre></td></tr></table></figure></div></li>
</ul>
<p>导入默认模块时,变量名可以自主制定,无需使用模块中的变量名</p>
<ul>
<li><p>命名导入</p>
<div class="highlight-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> {a,b,c} <span class="keyword">from</span> <span class="string">'./m1.js'</span></span><br></pre></td></tr></table></figure></div></li>
</ul>
<h3 id="类"><a href="#类" class="headerlink" title="类"></a>类</h3><h4 id="特殊方法"><a href="#特殊方法" class="headerlink" title="特殊方法"></a>特殊方法</h4><ul>
<li><p>构造函数</p>
<div class="highlight-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">constructor</span>(<span class="params"></span>){}</span><br></pre></td></tr></table></figure></div></li>
</ul>
<p>构造函数中,可以通过this来引用当前的对象</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">constructor</span>(<span class="params">name, age</span>){</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">name</span> = name;</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">age</span> = age;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div>
<h4 id="模式"><a href="#模式" class="headerlink" title="模式"></a>模式</h4><ul>
<li><p>严格模式</p>
<p>“use strict”</p>
<ol>
<li><p>类中的所有代码都会在严格模式下执行</p>
</li>
<li><p>函数的this不再是window,而是undefined</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> test = mc.<span class="property">fn</span></span><br></pre></td></tr></table></figure></div></li>
</ol>
</li>
</ul>
<div class="note note-warning icon-padding"><i class="note-icon fa-solid fa-exclamation-circle"></i><p>以方法形式调用时, this就是当前的实例。以函数形式调用, this是undefined</p>
</div>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">constructor</span>(<span class="params"></span>){</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">fn</span> = <span class="variable language_">this</span>.<span class="property">fn</span>.<span class="title function_">bind</span>(<span class="variable language_">this</span>) <span class="comment">//将fn方法的this绑定为当前实例</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></div>
<p>可以限制this绑定在自身</p>
<p>也可以使用箭头函数的形式调用,永远绑定为本身</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">constructor</span>(<span class="params"></span>){</span><br><span class="line"> fn = <span class="function">() =></span> {}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div>
<h4 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h4><div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Animal</span>{}</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span> <span class="keyword">extends</span> <span class="title class_ inherited__">Animal</span>{}</span><br></pre></td></tr></table></figure></div>
<p>在子类中重写父类构造函数时,应该在子类中第一时间调用父类构造函数,否则报错</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="title function_">constructor</span>(<span class="params">name, age</span>){</span><br><span class="line"> <span class="variable language_">super</span>(name, age); <span class="comment">//调用父类构造函数,并且需要加入父类参数</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></div>
<h4 id="属性"><a href="#属性" class="headerlink" title="属性"></a>属性</h4><ul>
<li><p>动态属性</p>
<p>需要首先new一个实例才能使用</p>
</li>
<li><p>静态属性</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">MyClass</span>{</span><br><span class="line"> <span class="keyword">static</span> name = <span class="string">'aaa'</span></span><br><span class="line"> <span class="comment">// 静态方法this不是实例对象而是当前类对象</span></span><br><span class="line"> <span class="keyword">static</span> fn = <span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'aaa'</span>)</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></li>
</ul>
<p>可以直接使用<code>MyClass.name</code></p>
<h3 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h3><hr>
<ul>
<li><p>map()</p>
<ol>
<li><p>可以根据原有的数组返回一个新数组</p>
</li>
<li><p>需要一个回调函数作为参数, 回调函数返回值会成为新数组中的元素</p>
<p>用法:</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> result = arr.<span class="title function_">map</span>(<span class="function">(<span class="params">item, index, array</span>) =></span> {</span><br><span class="line"> <span class="keyword">return</span> item+<span class="number">2</span></span><br><span class="line">}) </span><br><span class="line"><span class="comment">// 第一个参数 当前元素</span></span><br><span class="line"><span class="comment">// 第二个参数 当前元素索引</span></span><br><span class="line"><span class="comment">// 第三个参数 当前数组</span></span><br></pre></td></tr></table></figure></div></li>
</ol>
</li>
<li><p>filter()</p>
<p>过滤器</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line">result = arr.<span class="title function_">filter</span>(<span class="function">(<span class="params">item</span>) =></span> item % <span class="number">2</span> === <span class="number">0</span>)</span><br></pre></td></tr></table></figure></div>
<p>根据条件过滤元素</p>
<ul>
<li><p>find()</p>
<p>找第一个被过滤条件通过的元素</p>
</li>
</ul>
</li>
<li><p>reduce()</p>
<p>整合数组</p>
<div class="highlight-container" data-rel="Js"><figure class="iseeu highlight js"><table><tr><td class="code"><pre><span class="line">arr.<span class="title function_">reduce</span>(<span class="function">(<span class="params">prev, curr</span>) =></span> {}, <span class="number">0</span>) </span><br><span class="line"><span class="comment">// 0的位置是定义第一次prev的值, prev 上一次合并后值, curr 当前值</span></span><br></pre></td></tr></table></figure></div></li>
</ul>
]]></content>
<tags>
<tag>React Study</tag>
</tags>
</entry>
<entry>
<title>JavaScript-React-3</title>
<url>/2023/03/09/JavaScript-React-3/</url>
<content><![CDATA[<h3 id="React"><a href="#React" class="headerlink" title="React"></a>React</h3><hr>
<p>父组件传递属性,需要在子组件获取才能使用:</p>
<div class="highlight-container" data-rel="Jsx"><figure class="iseeu highlight jsx"><table><tr><td class="code"><pre><span class="line"><div className={<span class="string">`card <span class="subst">${props.className}</span>`</span>}></div></span><br></pre></td></tr></table></figure></div>
<p>props.children 表示组件的标签体</p>
<p>useRef().current 表示当前的DOM</p>
<p>事件对象:</p>
<ul>
<li><p>event包含所有触发事件对象信息</p>
<div class="highlight-container" data-rel="Jsx"><figure class="iseeu highlight jsx"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">descChangeHandler</span> = (<span class="params">event</span>) => {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(event.<span class="property">target</span>.<span class="property">value</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></li>
</ul>
]]></content>
</entry>
<entry>
<title>Linux</title>
<url>/2023/03/20/Linux/</url>
<content><![CDATA[<h3 id="ls"><a href="#ls" class="headerlink" title="ls"></a>ls</h3><p>当前目录下的所有内容(文件或文件夹)</p>
<p>默认目录home-家目录/home/‘username’</p>
<ol>
<li><p>命令参数[-a -l -h]</p>
<p>ls 目录 -查找目录下所有内容</p>
<p>-a-all 显示所有当前目录下所有内容(包括隐藏内容.)</p>
<p>-l-list 以列表方式加创建时间和权限组显示所有当前目录下所有内容</p>
<p>选项可以复合-al同时应用两类功能</p>
<p>-h 和-l混合使用 将内容容量以可读方式显示1KB,1MB等</p>
</li>
</ol>
<h3 id="cd"><a href="#cd" class="headerlink" title="cd"></a>cd</h3><p>切换工作目录Change Directory</p>
<p>cd [Linux路径] 无参数直接切换</p>
<p>不指定路径,直接回到home目录</p>
<h3 id="pwd"><a href="#pwd" class="headerlink" title="pwd"></a>pwd</h3><p>Print Work Directory</p>
<p>直接使用pwd打印当前工作目录路径 显示/home/xxx</p>
<h3 id="绝对路径"><a href="#绝对路径" class="headerlink" title="绝对路径"></a>绝对路径</h3><p>以根目录为起点,写出一个路径,以/为起点</p>
<h3 id="相对路径"><a href="#相对路径" class="headerlink" title="相对路径"></a>相对路径</h3><p>以当前目录为起点,写一个路径,不需要写/</p>
<h4 id="特殊路径符"><a href="#特殊路径符" class="headerlink" title="特殊路径符"></a>特殊路径符</h4><p>. 表示当前目录,比如 cd ./Desktop表示切换到当前目录下的Desktop目录内</p>
<p>.. 表示切换到上一级的某个目录</p>
<p>~ 表示HOME目录,比如cd ~即可退回HOME</p>
<h3 id="mkdir"><a href="#mkdir" class="headerlink" title="mkdir"></a>mkdir</h3><p>Make Directroy</p>
<p>创建目录,可以使用相对路径和绝对路径</p>
<p>makdir [-p] 路径</p>
<p>-p表示自动创建不存在的父目录</p>
<h3 id="ctrl-l-and-clear"><a href="#ctrl-l-and-clear" class="headerlink" title="ctrl+l and clear"></a>ctrl+l and clear</h3><p>清空屏幕</p>
<h3 id="touch"><a href="#touch" class="headerlink" title="touch"></a>touch</h3><p>创建文件</p>
<p>touch 路径</p>
<h3 id="cat"><a href="#cat" class="headerlink" title="cat"></a>cat</h3><p>查看文件内内容(全部打印)</p>
<p>cat 路径</p>
<h3 id="more"><a href="#more" class="headerlink" title="more"></a>more</h3><p>查看文件内内容(可翻页–more–)</p>
<p>more 路径</p>
<p>退出翻页查看(键盘q)</p>
<h3 id="cp"><a href="#cp" class="headerlink" title="cp"></a>cp</h3><p>copy</p>
<p>复制文件和文件夹</p>
<p>cp [-r] 参数1 参数2</p>
<p>-r 用于复制文件夹用,不输入即复制文件</p>
<p>参数1 表示被复制文件路径</p>
<p>参数2 表示要复制去的路径</p>
<h3 id="scp"><a href="#scp" class="headerlink" title="scp"></a>scp</h3><p>服务器之间传递文件</p>
<p>scp [-r] 参数1 参数2</p>
<ul>
<li><p>-r 用于复制文件夹</p>
</li>
<li><p>参数 本机路径或远程目标路径</p>
</li>
</ul>
<p>scp -r /export/server/jdk root@node2:/export/server/</p>
<p>将本机上的jdk文件夹,以root身份复制到node2的指定路径中</p>
<h3 id="mv"><a href="#mv" class="headerlink" title="mv"></a>mv</h3><p>move</p>
<p>移动文件夹和文件,改名</p>
<p>mv 参数1 参数2</p>
<p>参数与cp同</p>
<h3 id="rm"><a href="#rm" class="headerlink" title="rm"></a>rm</h3><p>remove</p>
<p>rm [-r -f] 参数1——n</p>
<p>删除文件和文件夹</p>
<p>-r 用于删除文件夹</p>
<p>-f 表示force 强制删除(不会弹出提示确认信息)</p>
<ul>
<li>普通用户不会弹出,root用户会弹出</li>
</ul>
<p>参数表示要删除的文件或文件夹路径空格隔开,可一起删除</p>
<h4 id="通配符"><a href="#通配符" class="headerlink" title="通配符*"></a>通配符*</h4><p>匹配任意内容</p>
<p>test* 匹配任何test开头的内容</p>
<p>*test * 匹配任何包含test的内容</p>
<p>*test 匹配test结尾的内容</p>
<p>rm -rf /* 强制删除根目录下所有内容</p>
<h3 id="which"><a href="#which" class="headerlink" title="which"></a>which</h3><p>查看命令的程序文件的路径</p>
<p>which [命令]</p>
<h3 id="find"><a href="#find" class="headerlink" title="find"></a>find</h3><p>搜索指定文件</p>
<p>find 起始路径 -name ‘查找文件名’</p>
<p>root用户全盘搜索</p>
<p>find 起始路径 -size +|-n [kMG]</p>
<ul>
<li><p>+,-表示大于和小于</p>
</li>
<li><p>n表示大小数字</p>
</li>
<li><p>kMG表示大小单位</p>
</li>
</ul>
<p>find / -size -10k</p>
<h3 id="grep"><a href="#grep" class="headerlink" title="grep"></a>grep</h3><p>从文件中通过关键字过滤文件行</p>
<p>grep [-n] ’关键字‘ 文件路径</p>
<h3 id="wc"><a href="#wc" class="headerlink" title="wc"></a>wc</h3><p>统计文件的行数</p>
<p>wc [-c -m -l -w] 文件路径(不加参数,显示行数,单词数,字节数,文件名)</p>
<p>-c 统计bytes数</p>
<p>-m 统计字符数</p>
<p>-l 统计行数</p>
<p>-w 统计单词数</p>
<h3 id="管道符"><a href="#管道符" class="headerlink" title="管道符(|)"></a>管道符(|)</h3><p>将管道符左边的结果,作为右边的输入</p>
<ul>
<li><p>cat test.txt | grep x</p>
</li>
<li><p>ls -lh /usr | wc -l</p>
</li>
<li><p>cat test.txt | grep x | grep xx</p>
</li>
</ul>
<h3 id="echo"><a href="#echo" class="headerlink" title="echo"></a>echo</h3><p>在命令行中输出指定内容</p>
<p>echo ‘输出的内容’</p>
<p>echo ``(反引号内输入命令) 输出命令结果 </p>
<h3 id="重定向符"><a href="#重定向符" class="headerlink" title="重定向符"></a>重定向符</h3><p>[>] 将左侧命令的结果,覆盖写入到符号右侧</p>
<ul>
<li>echo ‘hello’ > test.txt</li>
</ul>
<p>[>>] 将左侧命令的结果,追加写入符号右侧</p>
<ul>
<li>ls / > test.txt</li>
</ul>
<h3 id="tail"><a href="#tail" class="headerlink" title="tail"></a>tail</h3><p>可以查看文件尾部内容,跟踪文件最新更改</p>
<p>tail [-f -num] 路径</p>
<p>-f 表示持续跟踪</p>
<p>-num 表示查看尾部多少行,不填默认10行</p>
<ul>
<li>tail -5 test.txt</li>
</ul>
<h3 id="vi-x2F-vim"><a href="#vi-x2F-vim" class="headerlink" title="vi/vim"></a>vi/vim</h3><p>Linux中最经典的文本编辑器</p>
<p>vim是vi的加强版本,兼容vi的所有指令,不仅能编辑文本,还具有shell程序编辑的功能,可以不同颜色的字体来辨别语法的正确性</p>
<ol>
<li><p>命令模式 (Command mode)</p>
<p>所敲的按键编辑器都理解成命令,此模式下,不能自由进行文本编辑</p>
</li>
<li><p>输入模式(Insert mode)</p>
<p>此模式下,可以对文件内容进行自由编辑</p>
</li>
<li><p>底线命令模式(Last line mode)</p>
<p>以:开始,通常用于文件的保存和退出</p>
</li>
</ol>
<p>vim 文件路径</p>
<ul>
<li><p>如果文件存在打开,不存在则创建</p>
</li>
<li><p>从命令模式点击i进入输入模式</p>
</li>
<li><p>从输入模式使用esc退回命令模式</p>
</li>
<li><p>命令模式下按:进入底线命令模式</p>
<ul>
<li>wq w保存 q退出</li>
</ul>
</li>
</ul>
<p>命令模式命令</p>
<blockquote>
<p>$移动到行结尾</p>
<p>0移动到行开头</p>
<p>/进入搜索模式</p>
<p>n向下搜索</p>
<p>N向上搜索</p>
<p>yy复制当前行</p>
<p>p粘贴</p>
<p>dd删除当前行</p>
<p>ndd删除当前行和下面的n行</p>
<p>u撤销修改</p>
<p>ctrl+r反向撤销修改</p>
<p>gg跳到首行</p>
<p>G跳到最后一行</p>
<p>dG从当前行向下全部删除</p>
<p>dgg向上全部删除</p>
<p>d$从光标开始删除到本行行尾</p>
<p>d0从光标开始删除到本行行首</p>
</blockquote>
<p>底线命令模式命令</p>
<blockquote>
<p>:wq 保存退出</p>
<p>:q! 强制退出</p>
<p>:set nu 显示行号</p>
<p>:set paste设置粘贴模式</p>
</blockquote>
<h3 id="root-超级管理员"><a href="#root-超级管理员" class="headerlink" title="root(超级管理员)"></a>root(超级管理员)</h3><p>拥有最大的系统操作权限</p>
<h4 id="su"><a href="#su" class="headerlink" title="su"></a>su</h4><p>su - 默认切换root</p>
<p>su-root 密码 切换root管理员(-是为了在登录时加载环境变量)</p>
<p>exit 回退</p>
<p>root管理员切换其他账号不要密码</p>
<h4 id="sudo"><a href="#sudo" class="headerlink" title="sudo"></a>sudo</h4><p>临时以root身份执行命令</p>
<p>sudo 其他命令</p>
<p>只有认证的用户才能使用</p>
<ul>
<li><p>为普通用户配置认证</p>
<ul>
<li><p>切换到root用户,执行visudo命令打开/etc/sudoers</p>
</li>
<li><p>在文件最后添加:</p>
<p><code>intyou ALL=(ALL) NOPASSWD:ALL</code></p>
</li>
</ul>
</li>
</ul>
<h3 id="用户,用户组"><a href="#用户,用户组" class="headerlink" title="用户,用户组"></a>用户,用户组</h3><p>以下命令使用root用户执行</p>
<h4 id="用户组管理"><a href="#用户组管理" class="headerlink" title="用户组管理"></a>用户组管理</h4><p>groupadd 用户组名 创建用户组</p>
<p>groupdel 用户组名 删除用户组</p>
<h4 id="用户管理-Ubuntu"><a href="#用户管理-Ubuntu" class="headerlink" title="用户管理(Ubuntu)"></a>用户管理(Ubuntu)</h4><p>useradd [-g -d] 用户名</p>