首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

12.1、python内置函数——eval、exec、compile

内置函数——eval、exec、compile eval()将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4"))exec("print('hello,world')") code = ''' import os print(os.path.abspath('.')) '''code = ''' print(123) a = 20 print(a) '''a = 10exec(code,{'print':print},)print(a) compile将字符串类型的代码编译。 代码对象能够通过exec语句来执行或者eval()进行求值。 参数说明: 1.参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。 2.参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。 3.参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。 >>> #流程语句使用exec>>> code1 = 'for i in range(0,10): print (i)'>>> compile1 = compile(code1,'','exec') >>> exec (compile1) 1 3 5 7 9 >>> #简单求值表达式用eval>>> code2 = '1 + 2 + 3 + 4'>>> compile2 = compile(code2,'','eval') >>> eval(compile2) >>> #交互语句用single>>> code3 = 'name = input("please input your name:")'>>> compile3 = compile(code3,'','single') >>> name #执行前name变量不存在Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> name NameError: name 'name' is not defined >>> exec(compile3) #执行时显示交互命令,提示输入please input your name:'pythoner'>>> name #执行后name变量有值"'pythoner'"

优秀的个人博客,低调大师

Python Flask学习知识点(五)

timg (9).jpg 从本章开始,逐步引入数据库相关知识点。 关于数据库的工具以及一些入门的知识请自行查找资料学习(例如:创建数据表,数据库可视化工具)。 数据表创建方式 image.png 对于我们开发人员来说,一般推荐使用Code First ,因为可以专注业务模型的设计 而不是数据库设计 , 数据库只是用来存数据的 ,它的表关系应该由我们业务来决定。 那么其他两种数据表创建方式可以自己上网查询相关资料,这里不再赘述。 定义一个模型类 之前提过一个叫做验证层,现在引入模型层(MVC中的M:模型层) 设计模型的思维,应该考虑业务模型,而不要去过多注意数据库的设计,数据库只是存数据的。 app文件夹下新建models文件夹并新建一个名为book.py的模型: image.png 这里使用sqlalchemy这个包来做模型映射,还有一个包叫做flask_sqlalchemy,是flask在sqlalchemy的基础上做了一些自己的封装,待会我们也要用到。 再介绍一个第三方的独立的包:WTFORMS,Flask也针对这个包做了封装并有一个新的包叫做Flask_WTFORMS,以上两个(sqlalchemy、WTFORMS)是独立的两个包,可以用在任何时候而不仅仅在Flask中。 Flask的路由是在werkzeug基础上封装的 Flask是微框架,只提供最核心的功能其他部分可以自由组装 所有flask插件都必须和flask核心对象app绑定在一起 安装两个包:pip install sqlalchemypip install flask-sqlalchemy 编辑book.py: from sqlalchemy import Column, Integer, String from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Book(db.Model): # 主键 自增 id = Column(Integer, primary_key=True, autoincrement=True) # 长度50 不为空 title = Column(String(50), nullable=False) author = Column(String(30), default="未知") # unique : 不重复, 会加一个索引, 不重复 uid= Column(String(15), nullable=False, unique=True) 以上代码就是一个简单的创建数据表的模型,包含四个字段, 之前提到过,所有的Flask的插件都需要和Flask的核心对象app来关联起来,那么怎么做关联呢? 在app文件夹下的__init__.py中: from flask import Flask from app.models.book import db def create_app(): app = Flask(__name__) app.config.from_object("app.setting") app.config.from_object("app.secure") register_blueprint(app) db.init_app(app) db.create_all(app=app) return app def register_blueprint(app): from app.web import web app.register_blueprint(web) 首先把db对象导入, 再使用db.init_app(app)做关联,init_app这个方法很重要,后边所有的Flask插件都使用这个方法做关联。 接着, 需要把数据库的配置信息放到配置文件中,因为数据库配置信息是属于比较机密的,所以我们放在secure.py中。 SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://root:123456@127.0.0.1:3306/demo' 上边配置信息的变量名SQLALCHEMY_DATABASE_URI这个是不可以更改的,必须使用这个, 后边参数的意思是使用cymysql这个驱动来做数据库操作,用户名root 密码 123456,ip 端口是127.0.0.1 3306,数据库名为demo。 cymysql需要安装:pip install cymysql 运行代码查看结果,数据库确实多了一张名为book的表。 ORM与Code First ORM 对象关系映射 : 包含的层面更广阔 不仅仅是创建 还包含查询 更新 删除 与 Code First : 解决的是数据表创建的问题,专注业务模型设计而不是数据库设计,数据库只是存数据的,表关系应该有业务来决定 业务逻辑最好写在MVC中M中 Flask中上下文管理 应用上下文(AppContext) 请求上下文(RequestContext) 上下文本质来说其实就是对象 应用上下文:对核心对象Flask的封装 请求上下文:对请求对象Request的封装 为什么会需要上下文?直接操作Flask核心对象不行吗? 其实这个就是一个设计思想的问题,有时候对于一个对象来说,有一些信息是属于这个对象外部的,并不是属于对象本身,那么此时我们可以设计一个所谓的上下文(上下文就是一个对象),把Flask核心对象和外部的这些数据一起组成一个整体,这个整体就是我们说的上下文对象。 Flask核心对象:承载着各种各样的功能,例如:保存配置文件信息、提供注册路由\视图函数等这样的功能。 AppContext :把Flask核心对象做了一系列封装,并且附加了一些额外的参数 Request :保存了一些请求信息,例如: URL参数,完整的URL等等一切的请求信息都在这个对象中。 RequestContext : 对Request对象的封装。 在我们编码过程中,真正想去使用的是Flask核心对象或者是Request这个对象,但是我们要使用它并不一定要直接直接导入这俩核心对象,正确的做法是: 从AppContext或RequestContext间接的去拿Flask核心对象或者是Request。 Flask中,采用了LocalProxy模式(本地代理)的模式提供了间接去操作上下文的能力,也就是current_app和request这两个对象。 这里Flask使用了设计模式里边的代理模式。 Flask上下文与出入栈 Flask如何操作上下文?看下图: image.png 当一个请求进入Flask框架中时,首先会实例化一个RequestContext(请求上下文),这个请求上下文封装了这次请求的相关信息,请求的相关信息在Request中,然后会把请求上下文使用push方法推入到栈中(栈:先入后出),Flask中使用 LocalStack 来表示一个栈,LocalStack 是一个对象,实例化之后,用 _request_ctx_stack 来表示RequestContext推入的栈,同样的,还有一个 _app_ctx_stack 也是一个栈, RequestContext在入栈之前,Flask会去检查一下 _app_ctx_stack 这个栈的栈顶的元素,如果是空或者不是当前对象,那么Flask会把AppContext推入_app_ctx_stack这个栈中 然后才会把RequestContext推入_request_ctx_stack栈中。 current_app(Local Proxy) 和 request(Local Proxy) 永远都是指向栈顶的,所以当你去使用current_app或request,其实就是在操作这两个栈的栈顶元素。 欲知后事如何,请看下回分解,记得点个赞~感谢

优秀的个人博客,低调大师

Python Flask学习知识点(四)

timg (8).jpg 上节讲到,视图函数可以以接受参数的形式来获取传入后台的参数,但是往往我们需要对参数进行校验,比如说请求一个10条数据,那么page=10,但是如果某些比较皮的小盆友传入一个page=10000,那服务器也要去数据库查询10000条记录返回吗?显然不能那么做,所以这就涉及到在Flask中做参数检查的工作。 WTForms参数验证 首先,安装这个第三方的插件wtformspip install wtforms 我们都知道,在web应用中,分层这个概念非常重要,MVC模式其实可以理解为就是分层,这里我们引入验证层这个概念。无论写任何的web应用,验证层都是非常重要的概念。 所以我们所有的参数校验工作,都不会直接写到视图函数中,而是都会放到验证层去做。 在app文件夹下新建forms文件夹,并新建book.py文件: image.png 编写book.py: from wtforms.validators import Length, NumberRange, DataRequired() from wtforms import Form, StringField, IntegerField class SearchForm(Form): q = StringField(validators=[DataRequired(), Length(min=1, max=30)]) page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1) 解释这段代码: 使用wtforms提供的StringField对象来定义参数q的类变量 使用wtforms提供的IntegerField对象来定义参数page的类变量 wtforms内置了很多的验证对象来帮助我们快速的完成对参数的验证,而不需要手动编写验证函数。当然了,我们也可以自定义验证对象。 为了验证q参数,可以使用内置的验证对象:Length,验证q参数的长度,validators接受一个list,可以传入多个验证对象,这里我们验证q参数传入Length验证对象。 同样,验证page参数也是同样的原理,这里使用的三个内置的验证对象(NumberRange,Length,DataRequired),可以查阅文档了解详细的用法。 编写完验证层代码,在视图函数中调用,更改web文件夹下book.py: from flask import jsonify, request from flaskDemo.app.forms.book import SearchForm from . import web @web.route('/hello') def search(): form = SearchForm(request.args) if form.validate(): q = form.q.data page = form.page.data result = {"name": q, "valus": page} return jsonify(result) return jsonify({"error": 0}) 解释代码: 首先导入SearchForm并实例化为form对象,并且传入参数request.args,通过form.validate()的返回值判断是否符合验证器规定的结果。 这里讲一点,使用page = form.q.data这种方式获取q和page的值,而不直接使用q,是因为我们之前在验证层SearchForm中定义了page参数如果为空,使用1为默认值,所以我们要从form.q.data 这种拿到page参数。 看下效果,运行run.py启动,在浏览器中输入符合规则的urlhttp://127.0.0.1:8000/hello?q=demo&page=1 再输入不符合规则的urlhttp://127.0.0.1:8000/hello?q=demo&page=100 返回结果: image.png image.png 一个是成功,一个是失败。 因为之前我们在验证层中定义了page的最大值为99,所以如果输入100,就会返回错误。 再试一下不输入page参数:http://127.0.0.1:8000/hello?q=demo image.png 还是可以返回默认值。 继续,看下图: image.png debug调试过程中,看下form实例中的一个errors,这个errors就是当验证不通过时,wtforms给我们的一个错误提示,在一般情况下,如果参数验证不通过时是会抛出一个异常的,但是使用wtforms,它会把错误提示放到errors属性中而不抛出异常。 更改代码: def search(): form = SearchForm(request.args) if form.validate(): q = form.q.data page = form.page.data result = {"name": q, "valus": page} return jsonify(result) return jsonify({"error": form.errors}) 这里改为return jsonify({"error": form.errors})。 再运行代码输入URLhttp://127.0.0.1:8000/hello?q=demo&page=100得到如下: image.png 可见wtforms告诉我们为什么验证不通过。 这里也可以在SearchForm自定义返回的错误信息,只需更改为: class SearchForm(Form): q = StringField(validators=[DataRequired(), Length(min=1, max=30)]) page = IntegerField(validators=[NumberRange(min=1, max=99, message="传入的参数不符合要求")], default=1) 再运行代码: image.png 拆分配置文件 之前我们一直是把配置参数全部放到config.py中,但是这样的话会有一个问题,那就是如果我们把比较私密的配置(例如数据库地址以及密码)和普通的参数放在一起,势必会有安全风险,比如把代码传到了git上,所以最好把配置文件拆分为两种不同级别的,这里我们把config.py拆分为secure.py和setting.py,并且全部放到app文件夹下。 secure.py 用来存放数据库密码、账号还有我们后边提到的flask app key ,这样比较机密的信息,单独放配置文件中,还有就是开发环境和生产环境中的不同设置,比如 debug=True。 setting.py 用来存放不涉及到机密的,生产和开发环境一样的配置。 更改之前的代码,app文件夹下的__init__.py: def create_app(): app = Flask(__name__) app.config.from_object("app.setting") app.config.from_object("app.secure") register_blueprint(app) return app current_app 在Flask中,如果要在运行中读取配置文件中的参数,需要使用Flask核心对象app来查找,但是之前讲过,如果反复导入app,或造成循环导入,那么解决方法就是使用current_app,current_app其实就是指代的app, 例如,读取配置文件中的PER_PAGE变量: 因为之前我们做了这个操作: def create_app(): app = Flask(__name__) app.config.from_object("app.setting") app.config.from_object("app.secure") register_blueprint(app) return app 把setting.py和secure.py中的配置加到了Flask内置config对象中,所以要这样读取配置文件中的变量: current_app.config['PER_PAGE'] 欲知后事如何,请看下回分解,记得点个赞~感谢

优秀的个人博客,低调大师

Python全栈 Web(JavaScript 函数、数组)

循环: for循环 简化版while循环 语法: for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:循环条件初始化 表达式2:循环终止条件 表达式3:更新循环条件 流程: 1.先执行表达式1 声明条件 并且自走一次 2.表达式2 与循环条件的boolean值 3.进行循环操作 4.表达式3 更新循环条件 返回判断表达式2 for 和 while对比: 相同: 先判断条件然后在进行循环操作 不同: while:优先使用在不确定循环次数的场合下 for:优先使用在已知循环次数的条件下 通常用来遍历数据结构 循环的嵌套: 允许一个循环内部再出现一个循环 for(var i = 0; i <= 10; i++){ for(var x = 0; x <= 10; x++){ 循环体 } } 外层循环走以次内层循环走一轮 函数: function 是一段被定义好并且可以独立反复执行 并包含多条执行语句的代码块 在JS中创建函数: function 函数名 (参数){ 函数体 [返回值] //[] 代表可省略 } 参数列表; 如果没有参数为空 有则用逗号隔开多个参数 调用时有参数没有传参的参数值为undefined 返回值: 在函数体内经过运算后 返回给函数调用者的值 有返回值需要用 return进行返回 但是只能返回一个值 函数的调用: 在任意能写JS代码的地方 都可以调用函数 有参数 传递参数 否则参数列表为空 有返回值可以用变量接收 没有则返回 undefined 匿名函数: 匿名函数是一个没有名称的函数 该类函数会针对某一个 功能而存在 不能独立声明 语法: function (参数列表){ 函数体 } window.onload = function(){ console.log("hello world!"); } 网页加载的时所执行的内容都可以放在window.onload里 变量的作用域: 什么是变量的作用域? 指的是变量的可访问范围 js的作用域: 局部变量 使用var关键字声明在函数内的变量 就是局部变量 只能在函数内使用 全局变量 在function外声明的变量都是全局变量 声明变量只要不使用var关键字申明的变量都是全局变量 全局变量可以在任意函数内使用 尽量所有的变量都使用var关键字声明 变量的声明提前: 在JS中使用var关键字声明的变量在程序执行之前 都会被预读到所在作用域的顶端 但是赋值还会保留在原位 在变量赋值之前调用 不会报错 值为undefined 数组 - Array: 什么是数组? 以一种用于保存批量数据的数据结构 数组是按照线性结构来保存数据的 除第一元素外每一个元素都有一个“前驱元素” 除最后一个元素外每一个元素都有一个“后驱元素” 创建数组: 数组直接量创建: var 数组名 = []; var 数组名 = [1, 2, 3, "a", "b"]; 构造函数创建: var 数组名 = new Array(); var 数组名 = new Array(1, 2, 3, "a", "b"); *var 数组名 = new Array(5); //默认5个 undefined值 下标从5开始 数组的使用; 获取或设置数组的元素值 一律使用数组的下标 范围: 0 ~ arr1.length - 1 var arr1 = [1, 2, 3, 4, 5]; 索引: arr1[3] // 4; 索引超出范围是不会报错的 返回值为:undefined 索引赋值: arr1[3] = 9 // [1, 2, 3, 9, 5] 赋值也可以超出范围 在已有的最后一个元素和 超出范围元素之间的所有元素都为 empty 如果进行索引取值 结果都为:undefined 获取数组的长度: 属性: length 用法: 数组名.length 使用场合: 1.可以向数组的尾部插入元素 2.数组的长度 3.配合循环遍历数组中的每个元素 for (var i = 0; i < arr1.length; i++){ console.log(arr1[i]) } 在控制台中打印以下图形 * 4个空格1个* *** 3个空格3个* ***** 2个空格5个* ******* 1个空格7个* ********* 0个空格9个* <!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> <script type="text/javascript"> var line = 5; for (var i = 1; i <= line; i++){ var msg = ""; for (var j = 1; j <= line - i; j++){ msg += " "; } for (var k = 1; k <= i * 2 -1; k++){ if (k == 1 || k == i * 2 - 1){ msg += "*"; } else { msg += " "; } } console.log(msg); } for (var i = 1; i <= line; i++){ var msg = ""; for (var j = 1; j <= i; j++){ msg += " "; } for (var k = 1; k <= (line - i) * 2 -1; k++){ if (k == 1 || k == (line -i) * 2 -1){ msg += "*"; } else { msg += " "; } } console.log(msg) } </script> </head> <body> </body> </html>

优秀的个人博客,低调大师

Python全栈 Web(HTML标签大全)

<!-- H5的声明方式 --> <!DOCTYPE html> <br><br><br> <h4> <p>©ParisGabriel</p> <dir> 2018/9/1<br> QQ:1546079656<br> Eminl:1546079656@qq.com<br> </dir> <br><br><br><br><br> </h4> <!-- 文档的结束标记 --> <html> <!-- 网页的头部信息 --> <!-- 标题、选项卡图标、关键字、作者、描述等 --> <head> <!-- 网页标题 --> <title>首页</title> <!-- 字符编码 --> <meta charset="utf-8"> <!-- 选项卡图标 --> <link rel="shortcut icon" href="web.ico" type="image/x-icon"> </head> <p> <img src="./color.jpg"> </p> <!-- 网页的主体信息 --> <!-- 网页所呈现的内容等 --> <body> <!-- 空格:&nbsp;<br> 换行:<br> 小于:&lt;<br> 大于:&gt;<br> 版权符号:&copy;<br> 人民币:&yen;<br> --> 空格:<br> 换行:<br> 小于:<<br> 大于:><br> 版权符号:©<br> 人民币:¥<br> 斜体显示:<i>斜体</i><br> 下划线:<u>下划线</u><br> 文本加粗:<b>加粗</b><br> 删除线:<s>删除</s><br> 上标记:<sup>上标</sup><br> 下标记:<sub>下标</sub><br> 标题: <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> <h4>四级标题</h4> <h5>五级标题</h5> <h6>六级标题</h6> 水平对其方式: <h4 align="left">默认居右</h4> <h4 align="center">设置居中</h4> <h4 align="right">设置居左</h4> 水平线:<hr> 段落:<p></p> 分块: <div> 这是<br> 一块<br> 元素<br> </div> 分区:这是<span>绿色</span>、<span>黄色</span>、<span>红色的字体</span> 有序列表: <!-- type 属性:1、a、A、i --> <!-- start属性:开始位置 --> <ol type="1" start="10"> <li>有序列表列表项一</li> <li>有序列表列表项二</li> <li>有序列表列表项三</li> </ol> <!-- type属性:disc(实心圆)、circle(空心圆)、square(实心方框)、none(不显示) --> 无序列表: <ul type="square"> <li>无序列表列表项一</li> <li>无序列表列表项二</li> <li>无序列表列表项三</li> </ul> <!-- 有序列表无序列表可以任意嵌套 --> 图像标签: <!-- 属性:src(路径)、width、height、title(鼠标悬停标题)、alt(错误提示) --> <p>绝对路径:</p> <img src="C:\Users\Administrator\Desktop\HTML标签\501018476.jpg" width="800px" height="430px"> <p>相对路径:</p> <img src="项目.jpg" alt="文件路径不存在 项目.jpg" title="项目开发流程"> <p> 超链接: <!-- target属性:_self(默认窗口打开)、_blank(新建窗口打开)--> <a href="https://www.baidu.com" target="_blank">百度</a> <a href="C:\Users\Administrator\Desktop\HTML标签\bgvideo-720-2.mp4">视频</a> <a href="图片.zip">下载</a> <a name="bottom">设置锚点</a> <a href="#bottom">链接锚点</a> </p> <!-- 表格:<table> --> <!-- 行标签:<tr> --> <!-- 单元格:<td> --> <br> 表格: <!-- 属性:border(边框)、width、height、align(水平对齐) --> <!-- cellpadding(内边距)、cellspacing(外边距)、bgcolor(背景色) --> <table border="1px" width="200px" height="200px" cellspacing="10px" cellpadding="10px"> <!-- 属性:bgcolor、align(水平)、valign(垂直对齐):top、middle、bottom --> <tr> <!-- 属性:width、height、align、valign、bgcolor --> <!-- colspan(跨行合并单元格)、rowspan(跨列) --> <td align="center">单元格</td> <td align="center">单元格</td> </tr> <tr> <td align="center">单元格</td> <td align="center">单元格</td> </tr> </table> <br> 行分组: <table border="1px" width="300px" height="300px" cellspacing="10px" cellpadding="10px"> <thead> <tr> <td>表头</td> <td>表头</td> <td>表头</td> </tr> </thead> <tfoot> <tr> <td>表尾</td> <td>表尾</td> <td>表尾</td> </tr> </tfoot> <tbody> <tr> <td>表主体</td> <td>表主体</td> <td>表主体</td> </tr> </tbody> </table> <br> 合并单元格: <table border="1px" width="300px" height="300px" cellspacing="10px" cellpadding="10px"> <tr> <td colspan="2">跨列合并</td> <td>单元格</td> </tr> <tr> <td>单元格</td> <td rowspan="2">跨行合并</td> <td>单元格</td> </tr> <tr> <td>单元格</td> <td>单元格</td> </tr> </table> <br> 表单控件: <!-- 属性:action(指定数据提交地址)、method(请求方式) --> <form>表单控件</form> <br> 表单控件: <form> <!-- 属性:name(必填自定义名称)、value(控件上的默认值) --> <!-- maxlength(字符限制)、placeholder(文本框提示文本) --> 文本框:<input type="text" name="utext" placeholder="username"><br> 密码框:<input type="password" name="upaddeord"> </form> <br> 选择框: <form> <!-- 属性:name(用来同名分组)、value(控件代表的值)、checked(默认选择) --> 单选框:<input type="radio" name="radio"> 单选框:<input type="radio" name="radio" checked><br> 多选框:<input type="checkbox" name="checkbox"> 多选框:<input type="checkbox" name="checkbox"> </form> <br> 隐藏域: <frame> <!-- 属性:name(控件名)、value(控件值) --> <input type="hidden" name="uname" value="张三"><br> <!-- 属性:name(控件名称) --> <br> 文件选择框:<input type="file" name="图谱"><br> </frame> <br> 下拉菜单: <frame> <!-- 属性:name(URL后拼接数、value(选项值) --> <select name="province"> <option value="山东">山东省</option> <option value="山西">山西省</option> </select> </frame> <br><br> 文本域: <p> <!-- 属性:name(控件名)、cols(列数)、rows(行数) --> <textarea name="个性签名" cols="50" rows="10"></textarea> </p> 按钮: <p> <form> <!-- 属性:value(按钮名) --> <input type="submit" name="提交按钮" value="提交按钮"> <input type="reset" name="重置按钮" value="重置按钮"> <input type="button" name="普通按钮" value="普通按钮"> </form> </p> <!-- 在form外是普通按钮form内默认是提交 --> <!-- 可以添加属性type:submit、reset、button --> <p> <button> 普通按钮 </button> </p> 点击块: <form> <!-- 将文字和单选框之类的小按钮合并 点击文字也能选择 --> <label for="male">男</label> <input type="radio" name="gender" value="男" id="male"> <label for="female">女</label> <input type="radio" name="gender" value="女" id="female"> </form> </body> <!-- 文档的结束标记 --> </html>

优秀的个人博客,低调大师

Python全栈 Web(HTML基础语法)

超链接标签: 什么是超链接标签? 能够实现从当前文件跳转到其它文件的标签 语法: <a>超链接文本</a> 属性: href: 链接地址 #表示当前页面 可以为空“ ”也表示当前但是包含了网络请求 刷新页面的效果 本地文件协议: file:/// target:设置目标文件打开方式 _self:默认当前窗口打开 _blank:新建窗口打开 锚点链接: 链接到当前文件的指定位置 语法: 设置锚点 <a name="bottom"></a> 链接锚点 <a href="#bottom">跳转</a> 表格: 语法: 表格标签: <table> </table> 属性: border:设置边框(px) width:宽度 geight:高度 align:水平对齐对齐方式 cellpadding: 设置单元格内边距(内容与边框距离)(px) cellspacing: 设置单元格外边距(单元格与单元格、表格之间的距离)(px) bgcolor: 设置表格背景颜色 取值:英文的单向 行标签: <tr> </tr> (table row) 属性: bgcolor:设置当前行背景颜色 align:设置水平对齐方式 valign:设置垂直对齐方式 top:上 middle:中 bottom:下 单元格: <td> </td> (table data) 属性: width:单元格的宽度 height:单元格高度 align:水平对齐方式 valign:垂直对齐 bgcolor:背景颜色 创建顺序: 创建表格表标签 在表格标内嵌套行标签每个tr代表一行 在标签中创建单元格用来存放数据 <table> <tr> <td>name</td> <td>age</td> <td>score</td> <td>gander</td> </tr> </table> 单元格合并: 单元格独有的属性: colspan 跨 列合并: 从当前位置开始 横向合并n个单元(包含自身) 合并后要删除当行中多余的单元格 rowspan 跨 行合并: 从当前位置开始 纵向合并n个单元格(包含自身) 合并后要删除每列中多余的单元格 行分组: 允许将表格中若干行划分为一组 便于管理 这些标签可以省略 默认所有行都会添加到tbody中 如果需要手动添加分组, 建议thead --> tfoot --> tbody顺序书写 语法: 表头行分组: <thead> <tr></tr> </thead> 表尾行分组: <tfoot> <tr></tr> </tfoot> 主体行分组: <tbody> <tr> </tr> </tbody> 表单: 表单二要素: 1.form表单元素: 收集用户信息并发送给服务器 本身是不可见的 但是不能省略 因为数据的提交功能要由form元素完成 语法: <form>表单控件</form> 属性: action:用来指定数据提交的目的地址 method:数据请求方式 GET(默认)、POST... GET请求: 通常用于向服务器端获取数据 提交的数据会以参数的方式拼接在URL后面 安全性较低 提交的数据最大为 2KB POST: 将数据提交给服务器处理 隐式提交 看不到提交的数据 安全性较高 提交数据大小无限制 2.表单控件: 提供能够跟用户交互的可视化控件 只有放在表单元素中的表单控件才允许被提交 分类: 1). 文本框: 语法: <input type="text"> 密码框; 语法: <input type="password"> *属性: name: 定义当前控件的名称 缺省的话无法提交 value: 提交给服务器的值 同时也是默认显示在控件上的值 maxlength: 限时用户输入的最大字符数 placeholder: 用户输入之前显示在输入框中的提示文本 2). 单选框: <input type="radio"> 复选框: <input type="checkbox"> *属性: name: 定义控件名称,还起到分组的作用 一组的的按钮名称必须一致 value: 设置当前控件的值 最终提交给服务器 checked: 设置预选择状态 可以省略属性值或使用“checked” 3). 隐藏域: 需要用户提交给服务器却不需要呈现给用户 语法: <input type="hidden"> 属性: name:控件名称 value:控件值 文件选择框: 选择文件上传,发送给服务器 语法: <input type="file" 属性: name:定义控件名称 4). 下拉选择框: <select name="province"> <option value="山东省">山东省</option> <option values="山西省">山西省</option> </select> 使用 GET方式请求: URL后 拼接数据为 provide 5). 文本域: 语法: 支持用户输入多行文本 <textarea> </textarea> 属性: name:控件名 cols:指定文本域默认显示的列数 一行中文显示的英文量 减半 rows:文本域能够显示的函数 文本域可以由用户调整大小 6). 按钮: 提交按钮: <input type="submit"> 将表单数据发送给服务器 重置按钮: <input type="reset"> 重置表单 将表单内容初始化 普通按钮: <input type="button" value="点击"> 绑定自定义按钮事件 value:显示按钮的显示值 按钮标签: <button>按钮提示文本</button> 可以在任何局限中使用 不局限于form 按钮标签使用在 form中默认具有提交功能 --- input submit 可以添加属性type:submit、reset、button 在 表单外作为普通按钮需要通过js动态绑定事件实现 7). label for ID 将文字和单选框之类的小按钮合并 点击文字也能选择 语法: <label for="表单控件的ID"> </label> <input type="radio" name="gender" value="male" id="male">

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册