上一篇中,我们讲了一下在jinja模板中的一些逻辑操作,通过一些特定的逻辑语句,我们可以在模板中像写python一样循环或者判断一些变量,并渲染出相应的html来,而在这一篇中,我们要学习一下如何生成链接以及静态资源的地址,下面我们就一起来看看吧。

生成链接

路由地址

在flask的路由文件中,我们是用装饰器装饰一个函数来代表一个路由的,就像下面这样

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

@app.route('/post/')
def posts():
    allposts=[{'id':1,'title':'title1'},{'id':2,'title':'title2'}]
    return render_template('posts.html',posts=allposts)

@app.route('/post/<int:id>')
def post(id):
    return render_template('post.html',id=id)

而如果我们需要在模板或者路由文件中访问某个地址,我们可能会直接写出它的url,像下面这样

···
<a href='/'>首页</a>
<a href='/post/'>文章</a>
···
···
@app.route('/article/')
def article():
    return redirect('/post/')
···

其实这样写也没有什么毛病,只要是对应的url,是自己所想的就可以,不过有时候可能url太复杂,或者更改了url的规则,而这时就可能需要回去路由文件查看或者是重新修改html模板,另外,像上面所举的第三个路由例子,路由包含可变的部分,在html文件中,还需要拼接在一起,非常麻烦,所以我们就可以通过使用flask提供的url_for()函数来生成地址,简化操作。

想要生成一个路由的url地址,我们可以调用url_for()并传入路由函数名就可以了,在路由文件与html模板中都可使用这个函数,不过在路由文件中需要我们来引入,而在模板文件中则不需要。下面我们重新改写一下上面的例子。

···
<a href="{{ url_for('index') }}">首页</a>
<a href="{{ url_for('posts')}}">文章</a>
···
from flask import url_for

···
@app.route('/article/')
def article():
    return redirect(url_for('posts'))
···

可以看到,我们调用urf_for()函数时,传入路由函数名,就可以生成对应的链接,而对于动态路由,只需再接着传入对应的参数即可。

···
{% for post in posts %}
<a href="{{ url_for('post',id=post['id']) }}">{{ post['title'] }}</a>
{% endfor %}
···

url_for还有许多可选的参数,可以帮助我们生成我们需要的url类型,下面是一些常见的参数与用法。

url_for('index')
'/'
url_for('posts')
'/post/'
url_for('post',id=1)
'/post/1'
url_for('posts',page=2)#将非路由函数参数的参数转换为查询字符串
'/post/?page=2'
url_for('posts',_external=True)#返回绝对地址
'http://localhost:5000/post/'
url_for('post',id=2,_anchor='subtitle2')#为url添加一个锚,即一般所说的html页面定位符
'/post/2#subtitle2'

调用静态文件

url_for()除了可以生成路由的url,也可以生成静态文件的地址,在之前的文章中,我们在路由文件的同级目录下,除了创建了一个模板文件夹templates以外还创建了一个static文件夹,而这个文件夹就是用来存放静态文件的,可以放css、js、图片、视频等,那么要如何调用这些文件呢?

首先在static里面先放一些文件

Frog
  |--frog.py
  |--templates/
  |    |--...
  |--static/
       |--style.css
       |--myfunction.js
       |--pictures/
             |--a.png

可以直接在模板文件中直接写出静态文件的地址,像下面一样,url路径对应本地的文件路径

<link rel='stylesheet' href='/static/style.css'>
<script src='/static/myfunction.js'></script>
···
<img src='/static/pictures/a.png'>

另外我们也可以通过url_for()来生成静态文件的地址,我们把上面的例子改写一下

<link rel='stylesheet' href="{{ url_for('static',filename='style.css') }}">
<script src="{{ url_for('static',filename='myfunction.js') }}"></script>
···
<img src="{{ url_for('static',filename='pictures/a.png') }}">

这里也可以通过url_for()的_external来将静态文件的地址改成绝对路径,其他的也是一样的。而在我看来这两种方法没有哪一种更好,觉得哪种方便就用哪一种。

效果一览

其他

以上就是关于flask的链接与静态文件调用的一些分享啦,如果有什么建议或者发现了什么错误,亦或者有任何疑问欢迎在下面留言,我看到了会及时回复的。下一篇我们就来讲一讲flask的闪现消息,通过这个功能我们可以给到用户一个反馈,用户体验才会更好。下面是本篇文章示例的仓库地址:http://codemole.cn/felix/Frog/src/frog3.3。那我们下一篇再见吧。

评论

  • 最新随笔

  • (°ー°〃) (°ー°〃) 看你睡得那么香就不赶你了,整个抬走,换把椅子ㄟ(▔ ,▔)ㄏ
  • 还有这个移动端之前的随笔显示效果图片做对比,现在这样就更方便阅读一些
  • 找了点时间,重新调整了一下随笔的页面,这样看就顺眼多了,附上一张以前的随笔页图片。
  • 对于自己暂时没有能力改变的事情,屏蔽相关信息是保持平常心的方法之一,毕竟人的精力和注意力是有限的,投入眼前的事情反倒能在这个浮躁的世界收获一些自己的东西。专注脚下,偶尔抬头。
  • 这个随笔的页面找时间得改一改,阅读体验不太好......
  • 对于一些娱乐片段或者碎片化阅读的记忆,别穷思竭虑般地唤起回忆,想变得清晰,不能马上想起就放弃。毕竟在信息时代每天接受的信息量级巨大,若想大脑都填满这些碎片化的信息也是天方夜谭,而且在无法想起时也不建议有苦恼的情绪(如:我是不是有健忘症?是不是越来越严重了?之类的),因为频繁给自己这类心理暗示真的很有可能会往相关趋势发展。另外对于一些系统性学习的知识也建议保持类似的态度,因为除了一些频繁使用的知识,人脑真的记忆不过来那么多东西,在想不起时依靠记忆中相关的知识索引在世界中找到对应的内容即可。
  • 发现一个有趣现象,看了看发的文章,我用“我们”比用“我”更频繁,这是为啥。(随便一提,这是2022年第一条随笔,(笑哭))
  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。