最近两次遇到跨域问题。
Safari浏览器默认设置跨域
第一个是运行Flask程序时,本地应用请求远程CDN服务器上的js脚本时,出现了跨域导致资源访问不成功,预期js脚本没有执行。
奇怪的是在Chrome里打开应用,不报错;在Safari里打开则存在跨域,如下所示。
(图1-Chrome打开不报错,moment-with-locales.min.js获取成功)
Flask框架比Django后出来,砍掉了很多Django框架中冗余的东西,增加了很多新特性解决了Django框架的痛点。比如一个视图函数中,要控制用户在浏览器里输入的id是一个数字,Django在视图函数中通常使用正则表达式进行过滤,如下所示:
|
|
Flask则不需要这样,只需要在视图函数中使用converter类型的转换器来检查即可,如下所示:
|
|
为什么可以像上面这样呢,是因为Flask是基于Werkzurg的一个框架,Flask的Route在Werkzurg基础上进行了一层封装,继承了Werkzurg里的这种用法。这种机制叫做Converter ,可以通过特定的语法,将 URL中特定部分转化成对应的Python变量。
(Photo by Filip Bunkens on Unsplash)
下面这是春节返深后第一天,我总结假期期间学习的一些内容,当时写了想发出来,后来被耽误了就没发。
从1/24日到3/28,这是迄今为止在家时间待得最长的一个春节假期。2个月的时间里面,做了下面这些事情:
基于Python生态做了几十次standalone K8S和Docker-compose应用程序的开发和部署,期间遇到很多问题,解决一个冷不丁地又冒出来一个,这是软件开发这个行业的常态,各种细节问题层出不穷。
基于”未来的软件都将运行在容器里面”这个理念,花了2周左右时间学习Go语言,算基本入门吧,这门语言最大的优势是基于CSP模式在语法层面支持高并发,并且与容器技术紧密结合(Docker和K8S就是使用Go语言来构建),非常值得学习,今年会继续加强。
学习了Django开发,照着教程从0到1一行一行代码写了2个项目,基本可以独立担当Django主力开发角色,目前还差Django Restful Framework这一块,回去了马上补齐。
本文记录Django学习过程中遇到的奇怪问题。
现象:
把project目录下settings.py文件中DEBUG设置为False,页面均可以访问,但加载css和js资源提示404。将DEBUG调为True,这些404就没有了。
原因:
关闭DEBUG模式后,Django不再提供静态文件服务。
解决:
在 python3 manage.py runserver
命令后添加 --insecure
选项使Django强制处理静态文件。
上面只是临时解决,如果采用其它方式启动服务,添加--insecure
方法可能就不起作用,需要通过修改配置文件及url路由来彻底解决这个问题,步骤如下:
a. 在settings.py文件中加上
|
|
b. 在project的urls.py文件中增加如下修改(实测在app的urls.py文件中增加如下修改也能起作用):
|
|
c. 执行python3 manage.py collectstatic
收集静态资源文件
根据步骤a里STATIC_ROOT变量第二个参数的值决定是否执行python3 manage.py collectstatic
将每一个项目里面使用的静态文件收集到STATIC_ROOT
目录下
如果STATIC_ROOT变量的第二个参数如果填’static’,则需要执行python3 manage.py collectstatic
,否则修改不生效;
‘collectstatic’命令执行成功后会在project目录下生成一个static文件夹,里面会存放admin及blog应用使用到的所有静态文件。
如果STATIC_ROOT变量第二个参数填’blog/static’(在我project下面应用程序名称是blog),不需要执行python3 manage.py collectstatic
修改也能生效,但要注意不要把’blog/static’写成了’/blog/static’,否则修改不生效;
d. 特别说明
强烈建议使用步骤c中第一种方法,步骤c中方法二虽然可行,但是比较麻烦,如果project下有多个应用,就没办法配置了;而且第二种修改方法对Django Admin页面不生效,即应用程序的静态资源可以加载成功,但Admin页面的静态资源无法加载成功。
最近在B站学完一套Django视频课程,整理了一份Django Views思维导图,这一张介绍Django Views里面的HttpResponse对象,整理如下: