标签:基本 __ name falsk html 例子 data app def
概述
Flask作为Web框架,它的作用主要是为了开发Web应用程序。
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证FlaskLogin),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。
Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2
在Flask程序中,路由的实现一般是通过程序实例的route装饰器实现.
基本用法
helloword
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
还可以使用pycharm新建工程,选择falsk创建
开启调试模式
Debug模式的开启,可以更好的定位错误,还可以既是刷新修改的页面,不用重启服务器。
app.run(debug=True)
在运行的环境配置中,勾选Flask Debug
文件目录
falsk项目的static
路由
url_for的用法
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest = name))
if __name__ == '__main__':
app.run()
上述脚本有一个函数user(name),它接受来自URL的参数的值。
User()函数检查接收的参数是否与’admin’匹配。
如果匹配,则使用url_for()将应用程序重定向到
hello_admin()函数,否则重定向到将接收的参数作为guest参数传递给它的hello_guest()函数。
变量
在模板中**{{ variable }}**结构表示变量,是一种特殊的占位符,告诉模板引擎这个位置的值,从渲染
模板时使用的数据中获取;Jinja2除了能识别基本类型的变量,还能识别{};
使用**{% %}写语句,如{% for data in 迭代名%} {% end for %}**
from flask import Flask,render_template
import datetime
app = Flask(__name__)
@app.route('/')
def index():
name = ['刘备','关羽','张飞']
mydict = {'key':'silence is gold','a1':'武器','a2':'装备'}
time = datetime.date.today()
return render_template('test01.html',name=name, mydict = mydict ,time=time)
if __name__ == '__main__':
app.run(debug=True)
templates下的test01.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>你好,今天是{{ time }}</h3>
<h3>第一是{{ name[0] }}</h3>
<h3>
成员: {% for data in name %}
<li>{{ data }}</li>
{% endfor %}
</h3>
<h3>key = {{ mydict['key'] }}</h3>
<br>
<table border="1px">
{% for key ,value in mydict.items() %}
<tr>
<td>{{ key }}</td>
<td>{{ value }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
表单的用法
通过导入request可以调用方法等判断网络请求,可以调用form方法得到字典形式的form表单内容
from flask import Flask,render_template,request
import datetime
import requests
app = Flask(__name__)
@app.route('/')
def index():
name = ['刘备','关羽','张飞']
mydict = {'key':'silence is gold','a1':'武器','a2':'装备'}
time = datetime.date.today()
return render_template('test01.html',name=name, mydict = mydict ,time=time)
@app.route('/test/register')
def register():
return render_template('test/register.html')
# 接受表单的提交的路由,需要指定methods为post
@app.route('/result',methods=['POST','GET'])
def result():
if request.method == 'POST':
# 返回表单得到的内容,以字典方式返回,key,value为form表单的name和value
result = request.form
return render_template('test/result.html',result = result)
if __name__ == '__main__':
app.run(debug=True)
register.html
在action中可以使用url_for反向路由
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单注册</title>
</head>
<body>
<form action="{{ url_for('result') }}" method="post">
<p>姓名 : <input type="text" name="name"></p>
<p>年龄 : <input type="text" name="age"></p>
<p>性别 : <input type="text" name="sex"></p>
<p>地址 : <input type="text" name="location"></p>
<p><input type="submit" value="submit"></p>
</form>
</body>
</html>
result.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1px">
{% for key,valule in result.items() %}
<tr>
<td>{{ key }}</td>
<td>{{ valule }}</td>
</tr>
{% endfor %}
</table>
<img src="/static/a.jpg"></img>
</body>
</html>
搭建网站
爬虫
爬取豆瓣网站的电影top250
代码:
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request, urllib.error # 制定URL,获取网页数据
import xlwt # 进行excel操作
import pymysql
def main():
baseurl = "https://movie.douban.com/top250?start="
# 1.爬取网页
datalist = getData(baseurl)
# savepath = "豆瓣电影Top250.xls"
# 3.保存数据
# saveData(datalist,savepath)
saveData2DB(datalist)
# askURL("https://movie.douban.com/top250?start=")
# 影片详情链接的规则
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,表示规则(字符串的模式)
# 影片图片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S) # re.S 让换行符包含在字符中
# 影片片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
# 影片评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 找到评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>')
# 找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
# 找到影片的相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
# 爬取网页
def getData(baseurl):
datalist = []
for i in range(0, 10): # 调用获取页面信息的函数,10次
url = baseurl + str(i * 25)
html = askURL(url) # 保存获取到的网页源码
# 2.逐一解析数据
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表
# print(item) #测试:查看电影item全部信息
data = [] # 保存一部电影的所有信息
item = str(item)
# 影片详情的链接
link = re.findall(findLink, item)[0] # re库用来通过正则表达式查找指定的字符串
data.append(link) # 添加链接
imgSrc = re.findall(findImgSrc, item)[0]
data.append(imgSrc) # 添加图片
titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名
if (len(titles) == 2):
ctitle = titles[0] # 添加中文名
data.append(ctitle)
otitle = titles[1].replace("/", "") # 去掉无关的符号
data.append(otitle) # 添加外国名
else:
data.append(titles[0])
data.append(' ') # 外国名字留空
rating = re.findall(findRating, item)[0]
data.append(rating) # 添加评分
judgeNum = re.findall(findJudge, item)[0]
data.append(judgeNum) # 提加评价人数
inq = re.findall(findInq, item)
if len(inq) != 0:
inq = inq[0].replace("。", "") # 去掉句号
data.append(inq) # 添加概述
else:
data.append(" ") # 留空
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd) # 去掉<br/>
bd = re.sub('/', " ", bd) # 替换/
data.append(bd.strip()) # 去掉前后的空格
datalist.append(data) # 把处理好的一部电影信息放入datalist
return datalist
# 得到指定一个URL的网页内容
def askURL(url):
head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
# 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
# 保存数据
def saveData(datalist, savepath):
print("save....")
book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) # 创建工作表
col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")
for i in range(0, 8):
sheet.write(0, i, col[i]) # 列名
for i in range(0, 250):
print("第%d条" % (i + 1))
data = datalist[i]
for j in range(0, 8):
sheet.write(i + 1, j, data[j]) # 数据
book.save(savepath) # 保存
def saveData2DB(datalist):
init_db()
conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='movie', port=3306, charset='utf8')
cur = conn.cursor()
for data in datalist:
for index in range(len(data)):
if index == 4 or index == 5:
continue
data[index] = '"' + data[index] + '"'
sql = '''
insert into movie250 (
info_link,pic_link,cname,ename,score,rated,instroduction,info)
values(%s)''' % ",".join(data)
print(sql)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
def init_db():
conn = pymysql.connect(host='localhost',user='root',passwd='123456',db='movie',port=3306,charset='utf8')
cursor = conn.cursor()
sql = '''
create table movie250 (
id INT auto_increment PRIMARY KEY,
info_link text,
pic_link text,
cname varchar(200),
ename varchar(200),
score double,
rated int,
instroduction text,
info text
)ENGINE=innodb DEFAULT CHARSET=utf8;
'''
cursor.execute(sql)
conn.commit()
conn.close()
if __name__ == "__main__": # 当程序执行时
# 调用函数
main()
# init_db("movietest.db")
print("爬取完毕!")
首页制作
根据自己的需求,可以上网寻找网站模板,通过模板来修改自己的网站,如模板之家:http://www.cssmoban.com/等
http://www.cssmoban.com/tags.asp?n=%E5%85%8D%E8%B4%B9
找到后把html和其它文件分别放入tempaltes和static中
记得修改static路径,用crrl+r在pycharm中进行修改。
这里主要学会连接数据库,并存到列表里的内容
例子:
from flask import Flask,render_template
import sqlite3
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/index')
def home():
#return render_template("index.html")
return index()
@app.route('/movie')
def movie():
datalist = []
con = sqlite3.connect("movie.db")
cur = con.cursor()
sql = "select * from movie250"
data = cur.execute(sql)
for item in data:
datalist.append(item)
cur.close()
con.close()
print(datalist)
return render_template("movie.html",movies = datalist)
@app.route('/score')
def score():
score = [] #评分
num = [] #每个评分所统计出的电影数量
con = sqlite3.connect("movie.db")
cur = con.cursor()
sql = "select score,count(score) from movie250 group by score"
data = cur.execute(sql)
for item in data:
score.append(str(item[0]))
num.append(item[1])
cur.close()
con.close()
return render_template("score.html",score= score,num=num)
@app.route('/word')
def word():
return render_template("word.html")
@app.route('/team')
def team():
return render_template("team.html")
if __name__ == '__main__':
app.run()
标签:基本,__,name,falsk,html,例子,data,app,def 来源: https://blog.csdn.net/weixin_46155444/article/details/113982915
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。