Office Hours
Create Office Hours Chat
{% if status and status.video_room %}
Success! Office hours room: {{status.video_room.name}} ✅
{% endif %}
这个应用程序的UI并不复杂。它包括一个表单,允许用户输入他们的姓名、电话号码和他们希望接待人们的办公时间视频室的名称。它还有一个显示状态消息的部分,让用户知道房间是否创建成功。在这个HTML文件中,您还引用了一个_样式. css_文件—让我们现在创建它。
创造_static/styles.css_并粘贴以下CSS样式:
.container {
margin-top: 20px;
font-family: sans-serif;
}
h1 {
text-align: center;
}
form {
text-align: center;
}
.data-field {
margin-bottom: 0.5em;
}
input {
padding: 0.6em;
border: 2px solid rgb(177, 189, 233);
border-radius: 5px;
vertical-align: middle;
font-size: 14px;
}
input:focus {
outline: 0;
border-color: #0e364d;
}
label {
text-align: right;
display: inline-block;
width: 6em;
margin: 0 1em 0 0;
}
button {
padding: 0.75em 1em;
border: none;
background-color: rgb(27, 111, 189);
border-radius: 4px;
font-size: 100%;
color: rgb(255, 255, 255);
margin: 0.5em auto;
}
button:focus,
button:hover {
background-color: rgb(88, 166, 240);
}
button:active {
background-color: rgb(177, 189, 233);
}
#status {
margin: 0.5em auto;
text-align: center;
color: rgb(13, 73, 32);
}
现在你的应用看起来更有趣了。
是时候运行你的服务器了。但是,在此之前,在项目的根目录下创建一个名为_。flaskenv_。这是为烧瓶配置添加环境变量的地方。打开_。flaskenv_并添加以下几行:
FLASK_APP=app.py
FLASK_ENV=development
然后,在您的终端中,通过运行以下命令启动服务器:
flask run
一旦服务器启动,您将看到如下日志:
(venv) [office-hours] flask run
* Serving Flask app ‘app.py’ (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 290-231-040
如果您打开浏览器http://localhost:5000/,您将能够在那里看到应用程序:
既然已经设置了前端代码,那么是时候编写Python函数了,这些函数将实际控制视频房间的创建以及当有人加入房间时SMS的发送。
创建一个带有自定义超时的视频室
让我们定义一个名为get_or_create_room()
这将调用Twilio视频室API来获取或创建视频室。将以下代码粘贴到_app.py_要创建函数:
@app.route(‘/’, methods=[‘POST’])
def get_or_create_room():
identity = request.form.get(‘identity’).strip() or None
phone = request.form.get(‘phone’).strip() or None
room_name = request.form.get(‘room_name’).strip() or None
if identity is None or phone is None or room_name is None:
abort(400, ‘Missing one of: identity, phone, room_name’)
Try to get the room if it exists
video_room_list = client.video.rooms.list(limit=20)
found_video_rooms = [room for room in video_room_list if room.unique_name == room_name]
video_room = found_video_rooms[0] if found_video_rooms else None
request_url = request.url_root
callback_url = f’{request_url}message’
if video_room and video_room.status_callback != callback_url:
abort(400, ‘Status callback URL has changed; please create a room with a different name’)
If the room does not exist, create a new one
if not video_room:
video_room = client.video.rooms.create(
unique_name=room_name,
empty_room_timeout=60,
unused_room_timeout=60,
status_callback=callback_url,
status_callback_method=‘POST’,
)
office_hours_appointment = {
‘identity’: identity,
‘phone’: phone,
‘room_name’: video_room.unique_name,
‘room_sid’: video_room.sid
}
Check whether a record for this office hours meeting already exists
office_hours_meeting = Query()
selected_meeting = db.get(office_hours_meeting.room_sid == video_room.sid)
If a record does not exist, insert a new one
if not selected_meeting:
db.insert(office_hours_appointment)
return render_template(‘index.html’, status={
‘video_room’: {
‘sid’: video_room.sid,
‘name’: video_room.unique_name,
‘empty_room_timeout’: video_room.empty_room_timeout,
‘unused_room_timeout’: video_room.unused_room_timeout,
‘status_callback’: video_room.status_callback
}
})
该函数获取应用程序客户端发送的数据,并验证所需的一切都存在。然后,它获取视频房间名称的变量,并检查是否已经存在同名的活动房间。如果不存在,将使用输入的房间名称创建一个新房间。
该函数的一个关键部分是设置unused_room_timeout
和empty_room_timeout
。默认情况下,通过Rooms API创建的新的空视频室将保持活动状态5分钟,以便人们加入。如果没有人加入房间,它将关闭并需要重新创建。您可以通过设置unused_room_timeout
。该值表示无人加入时房间保持活动状态的分钟数。在办公时间房间的例子中,我们将这个值设置为60,这样即使没有人出现,房间也可以开放一个小时。您可以根据自己的喜好随意设置这个值。
另一个价值,empty_room_timeout
,用于设置在最后一个参与者离开后房间应该保持开放多长时间。在办公时间房间的情况下,房间的负责人可能希望在另一个参与者加入时加入房间,在他们的谈话结束后离开房间,然后在另一个参与者加入时再次进入房间。对于这个项目,我们已经设置了empty_room_timeout
到60分钟,但是你可以根据自己的喜好随意定制。
这个函数的另一个重要部分是我们在哪里设置一个status_callback
。这是一个URL,您的应用程序将通过它接收视频房间内发生的事件的状态信息。房间状态回叫事件的完整列表可以在这里找到。对于这个项目,我们将只跟踪participant-connected
事件,因为当有人加入视频房间时,我们希望通知房间创建者,以便他们也可以加入。应用程序将从请求的获取页面地址url_root
并添加/message
route,您将在下一步中创建它。
如果您想了解更多关于视频室的资源属性,请查看这里是Rooms REST API的文档 .
有人加入视频室时发送短信
是时候创建一条路由了,当有人加入视频室时,这条路由将向视频室的创建者发送短信。在…里_app.py_,在下面get_or_create_room()
,粘贴以下内容/message
路线和send_participant_notification()
功能:
@app.route(‘/message’, methods=[‘POST’])
def send_participant_notification():
event = request.values.get(‘StatusCallbackEvent’)
if event == ‘participant-connected’:
room_sid = request.values.get(‘RoomSid’)
office_hours_meeting = Query()
Query for the video meeting by its sid
selected_meeting = db.get(office_hours_meeting.room_sid == room_sid)
participant = request.values.get(‘ParticipantIdentity’)
room_name = selected_meeting.get(‘room_name’)
phone = selected_meeting.get(‘phone’)
identity = selected_meeting.get(‘identity’)
Send an SMS to the creator of the video meeting
client.messages.create(
body=f’Hello {identity}! {participant} has joined your office hours room: {room_name}',
from_=TWILIO_PHONE_NUMBER,
to=phone
)
return (‘’, 204)
在这个函数中,您获取状态回调事件并检查它是否是一个participant-connected
事件。如果是,该函数将采用room_sid
并在数据库中查找该房间,以获得应该通知的人的详细信息。一旦找到那个人的联系信息,它就使用他们的identity
和phone
号码发送手机短信,详细介绍participant
谁加入了视频室。
出于安全原因,您可能希望验证对应用程序的HTTP请求确实来自Twilio,而不是来自第三方。
Twilio添加了一个X-Twilio-Signature
头,并在其助手库中提供了一个内置的请求验证器,您可以用它来验证这个签名的真实性。在这里的文档中了解如何使用请求验证器 .
测试应用程序
是时候测试您的应用程序了。对于这一部分,您将需要一个Twilio视频应用程序,它允许您输入房间名称。如果您有自己的应用程序,请随意使用,或者您可以使用开源Twilio视频反应应用,如本教程中所示。
要获得Twilio Video React应用程序的代码,请在此处克隆存储库:https://github.com/twilio/twilio-video-app-react。按照中的说明进行操作自述文件在本地设置应用程序或在Twilio函数上部署它。
您还需要允许您的Flask应用程序可以访问更广泛的互联网,以便进行该测试。对于项目的这一部分,您可以使用工具创建临时公共URL。要启动新的ngrok隧道,请打开一个新的终端窗口,并从项目的根目录运行以下命令:
ngrok http 5000
ngrok运行后,您将在终端窗口中看到如下日志:
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!