flask-day2
pycharm的ssh配置
通过windows下的pycharm进行开发,服务器环境在阿里云:
在pycharm新建项目,在阿里云先创建虚拟环境,相关参数
网站所在目录:/root/www
virtualenv名称:flask01,
virutalenv所在目录:~/.virtualenvs/flask1
解释器:/root/.virtualenvs/flask1/bin/python
本地到远程目录映射:tools-deployment-mappings:
Excluded Paths:不需要映射的目录
自动上传:Tools-Deployment-Automatic upload(Always)
验证:
windows的pycharm新建一个demo.py文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "这是首页"
if __name__ == "__main__":
app.run(debug=True,port=8080,host="0.0.0.0",threaded=True)
会自动上传到云服务器:/root/www
=由于使用8080端口,云服务器必须开放该端口。=
在云服务器上运行:python demo.py,成功运行后在windows浏览器访问http://120.24..:8080可以看到“这是首页”的页面。
flask script
Flask-Script
的作用是可以通过命令行的形式来操作Flask
。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。要使用Flask-Script
,可以通过pip install flask-script
安装最新版本。
在云服务器上安装:pip install flask-script
新建manage.py:
from flask_script import Manager
from demo1 import app
manager = Manager(app)
if __name__ == "__main__":
manager.run()
浏览器访问地址仍然是:http://120.24..:8080
url与函数映射(url传参给函数)
子url传参
从之前的demo.py
文件中,我们已经看到,一个URL
要与执行函数进行映射,使用的是@app.route
装饰器。@app.route
装饰器中,可以指定URL
的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL
,文章详情的URL
是/article/id/
,id有可能为1、2、3…,那么可以通过以下方式:
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
@app.route("/articles/<int:id>/") # 规定Id的类型是int
def articles(id):
return "第%s(int)篇文章:必须包含整数篇" % id
其中<id>
,尖括号是固定写法,语法为<variable>
,variable
默认的数据类型是字符串。如果需要指定类型,则要写成<converter:variable>
,其中converter
就是类型名称,可以有以下几种:
- string: 默认的数据类型,接受没有任何斜杠
/
的字符串。 - int: 整形
- float: 浮点型。
- path: 和
string
类似,但是可以传递斜杠/
。 - uuid:
uuid
类型的字符串。
# 使用url:http://120.24.*.*:8080/test/4b77b215-adb1-4381-9051-730abef809ed
@app.route("/test/<uuid:id>/")
def uuid_test(id):
return "uuid是:%s " % id
- any:可以指定多种路径,这个通过一个例子来进行说明:
# 使用url :http://120.24.*.*:8080/art/ 或http://120.24.*.*:8080/blog/
@app.route("/<any(art,blog):url>/")
def tryIt(url):
return url
?=形式传参 data/s?wd=5
如果不想定制子路径来传递参数,也可以通过传统的?=
的形式来传递参数,例如:/article?id=xxx
,这种情况下,可以通过request.args.get('id')
来获取id
的值。如果是post
方法,则可以通过request.form.get('id')
来进行获取。
# demo.py
from Flask import request # 将request函数导入
@app.route("/data")
#访问:http://120.24.*.*:8080/data?username=abc&password=12345
def data():
username = request.args.get("username")
password = request.args.get("password")
print("username:",username,"password:",password)
return "你传递的参数是:%s,%s"% (username,password)
以上形式是通过定义一个函数,在函数中定义形参,url地址中的数据充当实参——从B/S结构角度来看,url地址就是request,即用户提交的信息在url的体现;函数是response,即服务器接收request并且返回数据。特殊的是用户的request并非来自页面,而是来自子url。其映射模型是url对应函数,即通过url调用函数,如果知道函数,想获得url(一个具体应用就是用户访问网站时会被引导到不同页面,知乎就是如此,未登录时引导到登录页面,已登录则引导到正文页面.这个页面由函数定义,具体是哪个url由函数来决定,用户不用参与),就需要用到url_for
构造URL(url_for)
一般我们通过一个URL
就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL
呢?url_for
函数就可以帮我们实现这个功能。url_for()
函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL
的后面作为查询参数。
通过构建URL
的方式而选择直接在代码中拼URL
的原因有两点:
- 将来如果修改了
URL
,但没有修改该URL
对应的函数名,就不用到处去替换URL
了。 url_for()
函数会转义一些特殊字符和unicode
字符串,这些事情url_for
会自动的帮我们搞定。
下面用一个例子来进行解释:
from flask import url_for,redirect #1. 导入 url_for指向不同函数,redirect重定向(跳转)到函数
@app.route("/urls/")
def url_delivery():
username = request.args.get("username")
if username:
return redirect(url_for("index")) #2. 如果url中?=传参带有username,则调用index函数
else:
return redirect(url_for("signin")) # 3.
@app.route('/')
def index():
return "这是首页"
@app.route("/signin/")
def signin():
return "这是登录页面"
页面跳转和重定向:
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但
是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
永久性重定向:
http
的状态码是301
,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com
的时候,会被重定向到www.jd.com
,因为jingdong.com
这个网址已经被废弃了,被改成jd.com
,所以这种情况下应该用永久重定向。
暂时性重定向:http
的状态码是302
,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
在
flask
中,重定向是通过flask.redirect(location,code=302)
这个函数来实现的,location
表示需要重定向到的URL
,应该配合之前讲的url_for()
函数来使用,code
表示采用哪个重定向,默认是302
也即暂时性重定向
,可以修改成301
来实现永久性重定向。
指定HTTP方法----GET/POST
在@app.route()
中可以传入一个关键字参数methods
来指定本方法支持的HTTP
方法,默认情况下,只能使用GET
请求,看以下例子:
@app.route('/test1',methods=["GET","POST"]) #浏览器请求方法只能是GET或POST
def test1():
return request.method
为了控制浏览器请求的方法,可安装Postman进行测试,输入http://120.24.144.212:8080/test1,选择GET或POST方法都可以正常访问,其他方法如PUT就不允许。
指定方法服务器控制浏览器请求的方式,例如对于请求有安全需求(如包含了密码等敏感数据),则强制要求使用POST方法,不允许明文传输数据
使用html模板
在项目下创建一个templates目录,右键点击,选择将其设为template folder,在里面创建index.html:
<form action="" method="post">
用户:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
demo.py:
@app.route("/login_t/", methods=["GET", "POST"]) #1.支持两种方法
def login_t():
if request.method == "GET": # 2.如果html是get方法,调用index.html,提交时会将用户名和密码明文显示在url里
return render_template("index.html")
else: # 3.如果是post方法,调用index.html,提交时会将用户名和密码显示在页面,url保持不变
username = request.form.get('username') #4.获取页面的表单元素值
password = request.form.get("password")
return '用户名%s,密码%s'% (username,password)