子域名
子域名在许多网站中都用到,比如一个网站叫做xxx.com
,那么我们可以定义一个子域名cms.xxx.com
来作为cms
管理系统的网址,子域名的实现一般也是通过蓝图来实现,我们创建蓝图的时候添加url_prefix=/user/
作为url
的前缀,那样我们就可以通过/user/来访问user下的url。但使用子域名则不需要。另外还需配置SERVER_NAME.
比如app.config[SERVER_NAME]='example.com:9000'
。并且在注册蓝图的时候,还需要添加一个subdomain
的参数。这个参数就是子域名的名称
from flask import Blueprint
bp = Blurprint('admin',__name__,subdomain='admin')
@bp.route('/')
def admin():
return 'Admin Page'
接下来看主app的实现
from flask import Flask
import admin
# 配置'SERVER_NAME'
# 实现子域名的两个配置:
# 在WindowsC盘/system32/etc下添加域名
# 127.0.0.1 => xxx.com
# 127.0.0.1 => cms.xxx.com
# 第二个就是配置SERVER_NAME
# app.config["SERVER_NAME"] = "xxx.com:5000"
app.register_blueprint(admin.bp)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=Ture)
SQLAIchemy介绍和基本使用
数据库是一个网站的基础,flask可以使用很多数据库,比如MySQL,MongoDB,SQLite,PostgreSQL等。以MySQL为例讲解。在flask中,如果想要操作数据库,可以使用ORM来操作数据库。首席需要按照这些模块:
- MySQL:如果是在Windows上,到官网中下载。如果是ubuntu,通过命令sudo apt-get install mysql-server libmysqlclient-dev -yq进行下载安装。
- pymysql:pymysql使用python来操作MySQL的包,因此通过pip来安装,命令如下:pip3 install pymysql
- SQLAlchemy: 它是一个数据库的ORM框架,我们在后面会用到。安装命令为:pip3 install SQLAlchemy。
数据库的基本使用:
from flask import Flask
from sqlalchemy import create_engine # 创建引擎
# 连接数据库
# 地址
HOSTNAME = "127.0.0.1"
# 数据库
DATABASE = 'demo0417'
# 端口号
PORT = 3306
# 用户名和密码
USERNAME = 'root'
PASSWORD = 'root'
# 创建数据库引擎 mysql+pymysql
DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URL)
# 创建连接
with engine.connect() as conn:
# 执行SQL语句,原生的SQL写法 ORM
result = conn.execute("select * from users")
# print(result)
print(result.fetchone()) # 查询第一条数据
# 解决 Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 489")
# pip install mysql-connector
# DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
首席按从sqlalchemu中导入create_engine,用这个函数来创建引擎,然后用engine.connect()来连接数据库。其中一个比较重要的一点是,通过create_engine函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来解释:
dialect+driver://username:password@host:port/database?charset=utf8
dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,并且转换成小写。driver是python对应的驱动,如果不指定,会默认的驱动,比如MySQL的默认驱动时MySQLdb。username是连接数据库的用户名,password是连接数据库的密码,host是连接数据库的域名,port是数据库监听的端口号,database是连接哪个数据库的名字。
ORM介绍
采用原生SQL的方式在代码中会出现大量的SQL语句,对项目的进展非常不利:
-
SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长,会出现很多相近似地SQL语句
-
很多地SQL语句是在业务逻辑中拼出来地,如果有数据库需要更改,就要去修改这些逻辑,很容易漏掉某些SQL语句地修改
-
写SQL时容易忽略web安全问题
ORM:object relationship mapping。对象关系映射,通过ORM我们可以通过类地方式去操作数据库,而不用写原生地SQL语句。通过把表映射成类,把行作为实例,把字段作为属性,ORM在执行对象操作地时候最终还是会把对应地操作转化成数据库原生语句
优点: -
易用性:使用ORM做数据库地开发可以有效地减少SQL语句,写出来地模型也更加直观
-
性能消耗小
-
设计灵活:可以轻松写出复杂地查询
-
可移植性:SQLAlchemy封装了底层地数据库实现,支持多个关系数据库,包括MySQL,SQLite。
ORM的使用
from sqlalchemy import create_engine # 创建引擎
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
# 连接数据库
# 地址
HOSTNAME = "127.0.0.1"
# 数据库
DATABASE = 'demo0417'
# 端口号
PORT = 3306
# 用户名和密码
USERNAME = 'root'
PASSWORD = 'root'
# 创建数据库引擎 mysql+pymysql
DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URL)
# 都要继承这个函数生成的基类
Base = declarative_base(engine)
# ORM操作数据库
class students(Base):
# 定义表的名字,操作这张表
__tablename__ = 'students'
# 给一些字段 创建这张不存在的表 id name age gender
# column 数据类型 数据的约束 主键 自增 1 2 3
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50), nullable=False)
gender = Column(Integer, default=1, comment= "1为男,2为女")
# 模型映射到数据库中
Base.metadata.create_all()
刷新sqlyog!