idhttp用post请求页面body_从零开始用flask搭建网站六

news/2024/5/17 14:48:47/文章来源:https://blog.csdn.net/weixin_35765225/article/details/112089919

814677ef305d46fbac673bcff41c6ac4.png

用户个人主页

现在我们来写一个用户个人主页,请求url为/user/<username>

app/routes.py: User profile view function

@app.route('/user/<username>')
@login_required
def user(username):user = User.query.filter_by(username=username).first_or_404()posts = [{'author': user, 'body': 'Test post #1'},{'author': user, 'body': 'Test post #2'}]return render_template('user.html', user=user, posts=posts)

可以看到@app.route和之前的有所不同,里面包含了一个username的变量,也就是说这个链接会根据不同的username进到不同的人的主页中。当然,前提是你必须登录,所以我加了一个@loginrequired的装饰器。上面这个view函数很简单,first_or_404()这个可以找到唯一一条数据,找不到就抛错。下面是对应的前端页面代码。

app/templates/user.html: User profile template

{% extends "base.html" %}{% block content %}<h1>User: {{ user.username }}</h1><hr>{% for post in posts %}<p>{{ post.author.username }} says: <b>{{ post.body }}</b></p>{% endfor %}
{% endblock %}

功能完成了,然后在页面上加一个个人主页的点击入口,如下:

app/templates/base.html: User profile template

 <div>Microblog:<a href="{{ url_for('index') }}">Home</a>{% if current_user.is_anonymous %}<a href="{{ url_for('login') }}">Login</a>{% else %}<a href="{{ url_for('user', username=current_user.username) }}">Profile</a><a href="{{ url_for('logout') }}">Logout</a>{% endif %}</div>

以上步骤得到的效果如下:

90f4a9f074d34310a005e778ebe15f4d.png

点击Profile试试看,是不是登录到你自己的主页里面去了

头像

加了个人主页之后,想要让用户能够添加自己喜欢的头像。如果直接把头像放在服务器上的话,除了占位置没什么好处--,所以使用Gravatar给每个用户添加头像。这个东西用起来很简单,就是用这个链接https://www.gravatar.com/avatar/<hash>获取你的头像。<hash>是你的email地址的hash值。下面是使用的一个例子

>>> from hashlib import md5
>>> 'https://www.gravatar.com/avatar/' + md5(b'john@example.com').hexdigest()
'https://www.gravatar.com/avatar/d4c74594d841139328695756648b6bd6'

默认图片是80*80,可以带上一个参数改变大小

https://www.gravatar.com/avatar/729e26a2a2c7ff24a71958d4aa4e5f35?s=128

好了,头像有了,现在把他加到user的model里面吧

app/models.py: User avatar URLs

from hashlib import md5
# ...class User(UserMixin, db.Model):# ...def avatar(self, size):digest = md5(self.email.lower().encode('utf-8')).hexdigest()return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format(digest, size)

identicon参数就是说,如果用户没有自己的头像的话,就给他统一发放一个标志性图像。下满完善一下用户主页模板。

app/templates/user.html: User avatar in template

{% extends "base.html" %}{% block content %}<table><tr valign="top"><td><img src="{{ user.avatar(128) }}"></td><td><h1>User: {{ user.username }}</h1></td></tr></table><hr>{% for post in posts %}<p>{{ post.author.username }} says: <b>{{ post.body }}</b></p>{% endfor %}
{% endblock %}

现在我们的用户主页那里会有一个大的头像,那如果下面有评论,为了好区分,每个用户名前都有一个小的个人头像图片,把上面的模板再改一下。

app/templates/user.html: User avatars in posts

{% extends "base.html" %}{% block content %}<table><tr valign="top"><td><img src="{{ user.avatar(128) }}"></td><td><h1>User: {{ user.username }}</h1></td></tr></table><hr>{% for post in posts %}<table><tr valign="top"><td><img src="{{ post.author.avatar(36) }}"></td><td>{{ post.author.username }} says:<br>{{ post.body }}</td></tr></table>{% endfor %}
{% endblock %}

上面这些步骤做完,得到的页面如下:

1431c68458289283216bc41542751d11.png

Jinja2的使用

上面写完了profile页面后,如果又想写一个跟这个页面布局一样的index页面。如果复制粘贴的话,只要一有修改,就得同时修改两个页面,这种肯定是不行的。

所以我写了一个子模板,这样就可以在一个页面当中使用同一套代码,不必来回修改,我取名_port.html,加前缀就是为了和其他模板进行区分

app/templates/_post.html: Post sub-template

  <table><tr valign="top"><td><img src="{{ post.author.avatar(36) }}"></td><td>{{ post.author.username }} says:<br>{{ post.body }}</td></tr></table>

然后我在user.html里面调用上面的模板,使用的是jinja2中的include函数

app/templates/user.html: User avatars in posts

{% extends "base.html" %}{% block content %}<table><tr valign="top"><td><img src="{{ user.avatar(128) }}"></td><td><h1>User: {{ user.username }}</h1></td></tr></table><hr>{% for post in posts %}{% include '_post.html' %}{% endfor %}
{% endblock %}

更多有趣的功能

我想在个人主页那里加上上次登录的时间,先要在user表里面多加两个字段

app/models.py: New fields in user model

class User(UserMixin, db.Model):# ...about_me = db.Column(db.String(140))last_seen = db.Column(db.DateTime, default=datetime.utcnow)

参照第4章讲到的,怎么同步表的改动呢?先执行

flask db migrate -m "new fields in user model"

再执行

flask db upgrade

然后把这两个字段加到user的模板中

app/templates/user.html: Show user information in user profile template

{% extends "base.html" %}{% block content %}<table><tr valign="top"><td><img src="{{ user.avatar(128) }}"></td><td><h1>User: {{ user.username }}</h1>{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}{% if user.last_seen %}<p>Last seen on: {{ user.last_seen }}</p>{% endif %}</td></tr></table>...
{% endblock %}

注意一下,我加了一个判断条件,只有点击过这个页面之后,才用显示,不然刚开始是看不到

下面我们来实现存储last_seen的值。

我想的是在用户下发请求之前就记录这个时间,flask有一个很有用的装饰器可以做到这一点,看下面的代码

app/routes.py: Record time of last visit

from datetime import datetime@app.before_request
def before_request():if current_user.is_authenticated:current_user.last_seen = datetime.utcnow()db.session.commit()

大家可能会好奇为什么没有执行db.session.add(),就可以直接提交了。因为当你调用current_user的时候Flask-Login会有一个回调函数已经做好了这一步,感兴趣的,可以去看下源码。执行完上面的操作会得到下面的效果,时间展示可能不是很好看,后面会有专门章节来解决这个问题。

29d211569849aab94471e5cb73df48ee.png

用户中心编辑

上面加的字段还有一个about_me,我是想允许用户自己编辑自己的信息,比如名字啥的,也可以加上一些对自己的介绍,下面,我们看看怎么加表单吧

app/forms.py: Profile editor form

from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Length# ...class EditProfileForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])about_me = TextAreaField('About me', validators=[Length(min=0, max=140)])submit = SubmitField('Submit')

about_me我用的是文本域,规定的文字输入长度。下面的模板实现展示上面的表单

app/templates/edit_profile.html: Profile editor form

{% extends "base.html" %}{% block content %}<h1>Edit Profile</h1><form action="" method="post">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=32) }}<br>{% for error in form.username.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.about_me.label }}<br>{{ form.about_me(cols=50, rows=4) }}<br>{% for error in form.about_me.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
{% endblock %}

下面这个view函数把我们上面讲的所有东西串起来

app/routes.py: Edit profile view function

from app.forms import EditProfileForm@app.route('/edit_profile', methods=['GET', 'POST'])
@login_required
def edit_profile():form = EditProfileForm()if form.validate_on_submit():current_user.username = form.username.datacurrent_user.about_me = form.about_me.datadb.session.commit()flash('Your changes have been saved.')return redirect(url_for('edit_profile'))elif request.method == 'GET':form.username.data = current_user.usernameform.about_me.data = current_user.about_mereturn render_template('edit_profile.html', title='Edit Profile',form=form)

上面这些操作得到的效果如下:

e792aaa4fd9acd9e03565e2a84d8a594.png

然后再加一个编辑用户信息的入口,这个入口当然是只有你自己可以进的

app/templates/user.html: Edit profile link

{% if user == current_user %}
<p><a href="{{ url_for('edit_profile') }}">Edit your profile</a></p>
{% endif %}

好了,到此,所有的工作完成之后,你得到的效果应该像下面这样,快试试吧

4fb7dd6d45ba5cb5007ab75185926c9b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_742188.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从小白进阶,三分钟教你如何编写伪静态实现网站页面响应

从小白进阶&#xff0c;三分钟教你如何编写伪静态实现网站页面响应伪静态简介&#xff1a;伪静态是相对真实静态来讲的。伪静态并不是真正的静态&#xff0c;实质上也是动态页面。伪静态有何作用&#xff1a;伪静态页面&#xff0c;其目的是为了更好的被搜索引擎收录而通过一定…

html如何隐藏pc端图片,自适应网站PC端隐藏移动端显示教程

有朋友求助我的网站是自适应设计&#xff0c;最近有个广告位图片PC端和移动端都显示&#xff0c;为了不影响手机端用户体验&#xff0c;我想把移动端广告隐藏&#xff0c;该怎么办呢&#xff1f;接下来我教大家怎么实现PC端显示移动端隐藏方法。1、CSS控制判断实现移动端隐藏方…

开源网站流量统计系统Piwik源码分析——参数统计(一)

Piwik现已改名为Matomo&#xff0c;这是一套国外著名的开源网站统计系统&#xff0c;类似于百度统计、Google Analytics等系统。最大的区别就是可以看到其中的源码&#xff0c;这正合我意。因为我一直对统计的系统很好奇&#xff0c;很想知道里面的运行原理是怎么样的&#xff…

php 百度竞价跳转代码,百度搜索关键词进网站的跳转到另外一个网站的实现方案...

很多时候&#xff0c;百度竞价或者是百度搜索进来关键词的时候需要做个跳转。前段时候有个客户让做了这样的一个效果。现在总结一下&#xff0c;给后来人做个参考。先说实现思路&#xff1a;1、我们先确定做跳转可能用到的是三种方法&#xff1a;①、服务器跳转&#xff0c;普遍…

查询网站的服务器时间限制,网站服务器时间查询工具

网站服务器时间查询工具 内容精选换一换备案是中国大陆的一项法规&#xff0c;使用大陆节点服务器提供互联网信息服务的用户&#xff0c;需要在服务器提供商处提交备案申请。根据工信部《互联网信息服务管理办法》(国务院292号令)和工信部令第33号《非经营性互联网信息服务备案…

关于网站被挂马的症状以及处理解决方法

2019独角兽企业重金招聘Python工程师标准>>> 如今绝大多数站长都在想着怎么建设外链&#xff0c;怎么发布网站内容&#xff0c;把自己网站的弄到首页或是前三位&#xff0c;网站安全其实也需要站长们注意&#xff0c;因为一旦网站安全出了问题&#xff0c;网站的排名…

手机网站按住放大图片_HTML5 手机图片触摸放大效果

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定(function(e, t) {var n ["touchstart", "touchmove", "touchend"];e.enlarge function(e, t, i) {var s document.getElementById(e);var a s.getElementsByTagName("img&q…

基于埋点日志数据的网络流量统计(网站总浏览量(PV)的统计)

衡量网站流量一个最简单的指标&#xff0c;就是网站的页面浏览量&#xff08;Page View&#xff0c;PV&#xff09;。用户每次打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计。 一般来说&#xff0c;PV与来访者的数量成正比&#xff0c;但是PV并不直接决定…

基于埋点日志数据的网络流量统计(网站独立访客数(UV)的统计)

在实际应用中&#xff0c;我们往往还会关注&#xff0c;到底有多少不同的用户访问了网站&#xff0c;所以另外一个统计流量的重要指标是网站的独立访客数&#xff08;Unique Visitor&#xff0c;UV&#xff09; 1.假设我们已经采集到数据UserBehavior&#xff0c;并将数据放在…

由12306.cn谈谈网站性能技术

12306.cn网站挂了&#xff0c;被全国人民骂了。我这两天也在思考这个事&#xff0c;我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促&#xff0c;而且完全基于本人有限的经验和了解&#xff0c;所以&#xff0c;如果有什么问题还请大家一起讨论和指正。&#xff0…

jmeter对http get网站访问压力测试

一 安装 下载jdk安装包 http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html 根据操作系统选择对应的包安装&#xff0c; 下载好安装包后&#xff0c;直接根据提示安装 下载apache jmeter安装包 http://jmeter.apache.org/download_jmeter.…

PHP大型电商网站秒杀思路

秒杀/抢购 技术&#xff1a;高可用&#xff0c;高并发 市场&#xff1a;用户体验&#xff0c;曝光度&#xff0c;促销 秒杀放单独服务器&#xff0c;这样即使崩溃不影响网站其他功能。 高可用&#xff1a;双活。 高并发&#xff1a;负载均衡&#xff0c;安全过滤。 阿里云…

手把手教你入侵网站修改数据_一天之内建好个人网站,手把手教你全过程

建个网站一年多少钱&#xff1f;如何自己搭建一个个人网站? 如何逐步构建一个优秀的外贸网站&#xff1f; 如果你有这些问题&#xff0c;那你看完我写的这次实际建站的过程&#xff0c;你就应该全明白了。首先看一下实际的费用。我在阿里云申请的域名http://www.tianjiju.com和…

个人网站备案起名_服务器域名备案是什么?

服务器域名备案是什么&#xff1f;网站备案是管局规定的&#xff0c;只要是国内网站就必须申请网站备案&#xff0c;不备案网站域名就无法打开&#xff0c;显示网站阻断提示。网站备案是指网站服务商帮助网站所有人给网站做域名备案。网站所有人需要提供给网站空间服务商备案资…

.net core3.0上传文件出现404_网站服务器经常性出现404错误的解决方案

网络上浏览页面出现的错误链接提示多种多样&#xff0c;出现404notfound也算是一个很普遍的问题&#xff0c;相信上网族都遇到过该情况&#xff0c;当我们打开某网页时会出现提示&#xff1a;404NotFound&#xff0c;看到该页面心情本就糟糕了&#xff0c;404notfound主要用于浏…

支持哪些格式的图标_建议收藏的7个高质量图标网站,一网打尽图标素材

大家好&#xff0c;这里是秋叶PPT图标是 PPT 制作中经常用到的元素之一&#xff0c;其比文字生动&#xff0c;比图片简洁的特性&#xff0c;应用在 PPT 中可以极大地提高页面的可阅读性&#xff0c;从而深受广大 PPT 爱好者喜爱。那应该到哪里可以找到高质量的图标素材呢&#…

宝塔 — 部署wordpress网站

运行wordpress需要用到的 nginx-1.15php-7.4mysql 先在根目录/www/wwwroot/下创建一个wordpress目录 添加站点&#xff08;注意确保端口未被占用&#xff09; 创建mysql数据库选择php版本不低于7 站点创建成功后用公网IP或者域名测试&#xff0c;会显示一个站点创建成功的…

花几天时间肝的在线制作词云图网站,真香。

背景&#xff1a;在可视化方面经常绘制词云图、折线图、柱状图等。为了方便绘制这些图表&#xff0c;辰哥就把这些可视化图的绘制做成可操作的过程。 最近也是在利用空闲时间做了一个在线制作词云网站&#xff08;后面会慢慢补上其他的图表&#xff09;&#xff0c;废话不多说&…

19个练习技术的在线网站,你知道几个?

不管你是一名开发人员、安全工程师、代码审计师、渗透 测试人员&#xff0c; 即便你是零基础&#xff0c;通过不断的练习才能让你成为一个优秀安全研究人员。 如果是对Python感兴趣的&#xff0c;这边也提供全套学习资料&#xff0c;请看文章末尾 以下网站希望能给各位安全小…

有什么好的学编程的网站或者是软件?『编程入门』?

现在的学习方式不外乎以下几种。 第一种 视频 好处是总算给了自己一个看起来在认真学习的借口了。看的很认真&#xff0c;写起来一个不会。三五个月或者是半年了&#xff0c;都写不出来一行代码是常有的事儿。 但是总归自己是花时间和精力了&#xff0c;对不对&#xff1f;特…