python&&Django框架基础&&学习笔记

2023-01-19 12:46:33

python Web程序

原始的web框架示例

#!/usr/bin/env python
#coding:utf-8
import socket
#应用程序
def handleRequest(client):
    buf = client.recv(1024);
    client.send(("HTTP/1.1 200 OK\r\n\r\n").encode(encoding='utf_8', errors='strict'))
    client.send(("hello DjanGo").encode(encoding='utf_8', errors='strict'))
#服务器程序
def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(("localhost",8000))
    sock.listen(5)
    
    while True:
        connection,address = sock.accept();
        handleRequest(connection)
        connection.close()
        
if __name__ == "__main__":
    main()
    

socket封装wsgiref接口的web框架示例

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server

def application(environ, start_response) :
    #获取用户的URL
    userUrl = environ['PATH_INFO']
    print(userUrl)
    
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
    #返回消息(Hello, 用户Url!)
    body = '<h1>Hello, %s!</h1>'%(environ['PATH_INFO'][1:] or 'web')
    return [body.encode('utf-8')]

if __name__ == '__main__':
    httpd = make_server('', 8000, application)
    print('Serving HTTP on port 8000...')
    httpd.serve_forever()

web框架流程图:
在这里插入图片描述

environ里面有什么?

在这里插入图片描述

MVC和MTV

MVC:
Model、View、Controller
MTV:
Model、Template、View
框架图示:
在这里插入图片描述

Django框架介绍

如何创建Django项目?

  1. 终端执行命令方式:django-admin、startproject、sitename等
  2. IDE创建Django程序方式:本质上都是自动执行上述命令
  3. 常用的命令有
python mange.py runserver 0.0.0.0
python mange.py startapp appname
python mange.py syncdb
python mange.py makemigrations
python mange.py migrate    //创建数据库

使用eclipse软件创建django项目:

在这里插入图片描述

使用CMD创建Django项目

#创建项目
D:\backupAll\eclipseRoot>django-admin.py startproject LearnDjangoDemo
D:\backupAll\eclipseRoot>dir
 驱动器 D 中的卷是 听说你很重要
 卷的序列号是 0D1E-0920

 D:\backupAll\eclipseRoot 的目录

2019/09/17/周二  21:17    <DIR>          .
2019/09/17/周二  21:17    <DIR>          ..
2019/09/09/周一  20:35    <DIR>          .metadata
2019/09/04/周三  09:53    <DIR>          20190903LearnSocket
2019/09/05/周四  17:05    <DIR>          20190905LearnFTP
2019/09/08/周日  14:24    <DIR>          20190905LearnThread
2019/09/09/周一  21:44    <DIR>          20190909LearnMultithreading
2019/09/10/周二  20:36    <DIR>          20190910LearnMonitor
2019/09/11/周三  10:41    <DIR>          20190911LearnHTML
2019/09/17/周二  15:34    <DIR>          20190917LearnMVCDemo
2019/09/17/周二  21:11    <DIR>          DjangoDemo2
2019/09/03/周二  14:16    <DIR>          learn20190903
2019/09/17/周二  21:17    <DIR>          LearnDjangoDemo
2019/08/12/周一  17:30    <DIR>          project001
2019/09/05/周四  21:36    <DIR>          temp
               0 个文件              0 字节
              15 个目录  4,886,462,464 可用字节
D:\backupAll\eclipseRoot>cd LearnDjangoDemo

D:\backupAll\eclipseRoot\LearnDjangoDemo>dir
 驱动器 D 中的卷是 听说你很重要
 卷的序列号是 0D1E-0920

 D:\backupAll\eclipseRoot\LearnDjangoDemo 的目录

2019/09/17/周二  21:23    <DIR>          .
2019/09/17/周二  21:23    <DIR>          ..
2019/09/17/周二  21:23               386 .project
2019/09/17/周二  21:23               323 .pydevproject
2019/09/17/周二  21:24    <DIR>          LearnDjangoDemo
2019/09/17/周二  21:17               656 manage.py
               3 个文件          1,365 字节
               3 个目录  4,886,376,448 可用字节
#创建app
D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py startapp web

D:\backupAll\eclipseRoot\LearnDjangoDemo>dir
 驱动器 D 中的卷是 听说你很重要
 卷的序列号是 0D1E-0920

 D:\backupAll\eclipseRoot\LearnDjangoDemo 的目录

2019/09/17/周二  21:27    <DIR>          .
2019/09/17/周二  21:27    <DIR>          ..
2019/09/17/周二  21:23               386 .project
2019/09/17/周二  21:23               323 .pydevproject
2019/09/17/周二  21:24    <DIR>          LearnDjangoDemo
2019/09/17/周二  21:17               656 manage.py
2019/09/17/周二  21:27    <DIR>          web
               3 个文件          1,365 字节
               4 个目录  4,886,368,256 可用字节
#启动Django程序
D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py runserver 0.0.0.0:9000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 17, 2019 - 21:56:28
Django version 2.2.5, using settings 'LearnDjangoDemo.settings'
Starting development server at http://0.0.0.0:9000/
Quit the server with CTRL-BREAK.
[17/Sep/2019 21:56:38] "GET / HTTP/1.1" 200 16348
Not Found: /favicon.ico
[17/Sep/2019 21:56:38] "GET /favicon.ico HTTP/1.1" 404 1981
[17/Sep/2019 21:56:38] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[17/Sep/2019 21:56:39] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[17/Sep/2019 21:56:39] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[17/Sep/2019 21:56:39] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
#创建更改的文件0001_initial.py
D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py makemigrations
Migrations for 'web':
  web\migrations\0001_initial.py
    - Create model UserInfo
#将生成的py文件应用到数据库
D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, web
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
  Applying web.0001_initial... OK

------------------------------------------------------------------------------------------------------------------------------------------------
mysqlLog:
mysql> use day11;
Database changed
mysql> show tables ;
+----------------------------+
| Tables_in_day11            |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| web_userinfo               |
+----------------------------+
11 rows in set (0.01 sec)

mysql> desc web_userinfo ;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(50) | NO   |     | NULL    |                |
| password | varchar(50) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
------------------------------------------------------------------------------------------------------------------------------------------------

Django程序框架图示:
在这里插入图片描述

url分发过程

  1. 在全局的url做分发,一个url匹配模式对应一个app.urls文件
from django.contrib import admin
from django.urls import include,path
#设置url映射规则(默认从上往下,匹配即终止的规则)
urlpatterns = [
    path('admin/', admin.site.urls),
    #把项目URL映射到AppURL处(Url分发)
    #前缀是web的URL均由web.url文件处理
    path('web/', include('web.urls')),
]
  1. 在app的url做分发,一个url匹配模式对应一个function方法
from django.contrib import admin
from django.urls import path
#导入webapp模块
from web.views import index,login,list
#设置url映射规则(默认从上往下,匹配即终止的规则)
urlpatterns = [
    #path('admin/', admin.site.urls),
    #如访问xxx:9000/index,则调用index函数(在webapp模块内)
    path('index/', index),
    path('login/', login),
    #设置动态url
    path('list/<int:year>', list),
    #设置动态url中的默认值",{"key":123}".
    #"/$"代表终止符,自动添加url末尾的斜杠"/".
    #注意。有无斜杠关系url是否匹配正确、成功.
    path('list/<int:year>/', list,{"key":123}),
    #http://localhost:9000/web/list/2019/
]

http://localhost:9000/list/111/
对于Django来说,最后的斜杠"/"是必须的,如果不加,可能会出现URL模式匹配错误。

可以使用"path(’^’, func),"的方式提取全部访问urls到函数func内,由自定义的函数func统一处理。
Django是MTV模式

Django连接数据库配置

1.创建数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| day05              |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

mysql> create database day11 ;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| day05              |
| day11              |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
8 rows in set (0.00 sec)

2.配置settings.py连接mysql数据库
settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day11',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '',
        'PORT': '',
    }
}

3.更改"INSTALLED_APPS"将webApp与project建立联系
settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'web',
]

4.定义创建数据库中表
web models.py

from django.db import models

#创建数据库的表UserInfo类class,继承自models.Model类
class UserInfo(models.Model):
    #定义静态字段username
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)

5.开始创建表

D:\backupAll\eclipseRoot\LearnDjangoDemo>dir
 驱动器 D 中的卷是 听说你很重要
 卷的序列号是 0D1E-0920

 D:\backupAll\eclipseRoot\LearnDjangoDemo 的目录

2019/09/17/周二  22:27    <DIR>          .
2019/09/17/周二  22:27    <DIR>          ..
2019/09/17/周二  21:23               386 .project
2019/09/17/周二  21:23               323 .pydevproject
2019/09/17/周二  21:50    <DIR>          .settings
2019/09/17/周二  21:56                 0 db.sqlite3
2019/09/17/周二  21:24    <DIR>          LearnDjangoDemo
2019/09/17/周二  21:17               656 manage.py
2019/09/17/周二  21:53    <DIR>          template
2019/09/18/周三  11:35    <DIR>          web
2019/09/17/周二  22:27    <DIR>          __pycache__
               4 个文件          1,365 字节
               7 个目录  5,084,864,512 可用字节

D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py makemigrations
Migrations for 'web':
  web\migrations\0001_initial.py
    - Create model UserInfo

D:\backupAll\eclipseRoot\LearnDjangoDemo>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, web
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
  Applying web.0001_initial... OK

D:\backupAll\eclipseRoot\LearnDjangoDemo>

修改model对数据库中表增删改查,并执行上面步骤5即可生效。
Django不能创建数据库,但能创建数据库中的表。

通过Django写的sql性能要差,通过原生方法写的sql性能要好。

Django之创建表字段汇总

 #自增列
    models.AutoField
    #!!字符串字段.必须max_length参数
    models.CharField
    #!!布尔类型=tinyint(1).不能为空。Blank=True
    models.BooleanField
    #用逗号分割的数字=varchar.继承CharField,必须max_length参数。.可以生成以逗号分隔的字段,即一列中多个逗号分隔。
    models.CommaSeparatedIntegerField
    #日期类型=data.对于参数"auto_now=True",则每次更新都会更新这个时间
    models.DateField
    #日期类型=datatime.同DateField参数
    models.DateTimeField
    #十进制小数类型=decimal.必须指定整数位max_digits和小数位decimal_places
    models.DecimalField
    #字符串类型(正则表达式邮箱)=varchar
    models.EmailField
    #浮点类型=double
    models.FloatField
    #整形
    models.IntegerField
    #长整形
    models.BigIntegerField
    #字符串类型(Ipv4正则表达式)
    models.IPAddressField
    #字符串类型(ipv4和ipv6是可选的).参数protocol可以使both、ipv4、ipv6
    models.GenericIPAddressField
    #允许为空的布尔类型
    models.NullBooleanField
    #正Integer
    models.PositiveIntegerField
    #正smallInteger
    models.PositiveSmallIntegerField
    #减号、下划线、字母、数字
    models.SlugField
    #数字。数据库中的字段有:tinyint、smallint、int、bigint
    models.SmallIntegerField
    #!!字符串=longtext.用于存放大字符串
    models.TextField
    #时间=HH:MM[:ss[.uuuuuu]]
    models.TimeField
    #字符串,地址正则表达式
    models.URLField
    #二进制
    models.BinaryField
    #图片
    models.ImageField

varchar 与 char 与nvarchat的区别
varchar存放可变长度字符
char存放不可变长度字符
nvarchar存放可变长度中文字符

Django实现外键控制

from django.db import models

# Create your models here.

#创建数据库的表UserInfo类class,继承自models.Model类
class UserInfo(models.Model):
    #定义静态字段username
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    #使用"default="设置默认值
    Gender = models.BooleanField(default=False)
    Age = models.IntegerField(default=18)
    memo = models.TextField(default='now no')
    CreateDate = models.DateTimeField(default='2019-09-18 12:12')
    
    #在表UserInfo和表UserType之间建立外键关系
    typeId = models.ForeignKey('UserType')
    #表UserType对表UserInfo是一对多 
class UserType(models.Model):
    name = models.CharField(max_length=50)

多对多的表结构需要三张表实现。

Django实现数据库表多对多、一对一关系示例

from django.db import models

# Create your models here.

#创建数据库的表UserInfo类class,继承自models.Model类
class UserInfo(models.Model):
    #定义静态字段username
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    #使用"default="设置默认值
    Gender = models.BooleanField(default=False)
    Age = models.IntegerField(default=18)
    memo = models.TextField(default='now no')
    CreateDate = models.DateTimeField(default='2019-09-18 12:12')
    
    #在表UserInfo和表UserType之间建立外键关系
    typeId = models.ForeignKey('UserType')
    #表UserType对表UserInfo是一对多 
class UserType(models.Model):
    name = models.CharField(max_length=50)
    
class Group(models.Model):
    name = models.CharField(max_length=50)
    
class User(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    #在表和表之间建立多对多的关系,以下代码使用时会自动建立第三张表实现多对多的关系
    group_relation = models.ManyToManyField('Group')
    #在表和表之间建立一对一的关系
    #group_relation = models.OneToOneField('Group')

多对多:常用于类似好友关系的场景
一对一:常用于多个不同业务间合并数据库的场景
一对多:常用于数据库表中某列数据较长且单调且重复较多的场景

Django之数据库表列的类型汇总

  1. null=True:数据库中字段是否可以为空
  2. blank=True:Django的admin中添加数据时是否可允许空值
  3. primary_key=False:主键,对AutoFiled设置主键后,就会替代原来的自增id列
  4. auto_now:自动创建,无论添加或修改,都是当前操作的时间。即更新数据时间
  5. auto_now_add:自动创建,永远是创建的时间。即创建数据时间
  6. choices:GENDER_CHOICE=((u’M’,u’Male’),(u’F’,u’Female’))
  7. max_length
  8. default:默认值
  9. verbose_name:admin中字段的显示名称
    10.unique=True:不允许重复
    11.db_index=True:数据库索引
    12.editable=True:在admin的编辑框内是否可以编辑
    13.name|db_column:数据库中的字段名称
    14.error_message=None:错误提示
    15.auto_created=False:自动创建
    16.help_text:在admin中提示帮助信息
    17.validators=[] #使用validators定义范围内数据为有效可用数据
    18.upload-to

每张表里面只能有一个主键,
主键的值唯一,
主键默认带有索引,
查询数据库语句带有索引时可以提高查询效率

class Args(models.Model):
    #定义静态字段name,并设置可不可以为空属性.True代表可以为空
    name = models.CharField(max_length=50,null=True)
class Temp(models.Model):
    GENDER_CHOICE = (
        (u'M',u'Male'),
        (u'F',u'Female'),          
    )
    #定义静态字段gender,gender只存M或F."GENDER_CHOICE"会记载到内存中。
    gender = models.CharField(max_length=2,choices=GENDER_CHOICE)

Django的model对数据的增删改查

from django.shortcuts import render
from django.shortcuts import HttpResponse
from web.models import Asset
# Create your views here.

#在web views.app内对数据库表进行增删改查操作。
#创建数据
def Add(request,name):
    #将形参name存到数据库的hostname列
    #方法一
    #Asset.objects.create(hostname=name) #有bug
    #方法二
    insertObj=Asset(hostname=name)
    insertObj.save()
    return HttpResponse("insert" + name + "ok!")
def Delete(request,name):
    Asset.objects.get(hostname=name).delete()
    
    return HttpResponse("delete ok!")
def Update(request,id,hostname):
    #print(id)
    print(hostname)
    '''
    #查询符合条件的单个数据并进行修改。即get只能获取一条数据,若查询结果为空,则报错
    #obj = Asset.objects.get(id=id)
    #obj.hostname = hostname
    #obj.save
    '''
    #修改数据库内id大于id的数据的hostname=hostname。
    #其中"id__gt"是双下划线,代表id > 。
    #其中"id__contains",代表id  like.
    #其中"id__in=",
    
    Asset.objects.filter(id__gt=id).update(hostname=hostname)
    return HttpResponse("update ok!")
def Get(request):
    '''
    #对数据库做模糊查询并取出
    assetList = Asset.objects.filter(hostname__contains=hostname)
    print(assetList)
    for item in assetList:
        print(item.id)
    return HttpResponse("get ok!")
    '''
    #其中"Asset.objects.all"代表取数据库内全部数据
    #alldata = Asset.objects.all()
    #获取全部数据的前两个
    #alldata = Asset.objects.all()[0:2]
    #其中"order_by"代表以什么样的规则排序
    #其中"-id"代表按id的倒序,不加横杠"-"默认正序
    #alldata = Asset.objects.all().order_by('-id')
    #输出Django执行的mysql语句
    #print(alldata.query)
    #使用"values("id","hostname")"取全部数据中的特定几列数据
    alldata = Asset.objects.all().values("id","hostname")
    #<QuerySet [{'id': 1, 'hostname': 'dfq'}, {'id': 2, 'hostname': 'qwe'}, {'id': 4, 'hostname': 'dayu3'}, {'id': 5, 'hostname': 'dayu3'}]>
    print(alldata)
    #原始sql语句
    cursor = connection.cursor()
    cursor.execute('''select id,hostname from asset;''')
    row = cursor.fetchone()
    #对数据库按规则排序并取前n条数据
    return HttpResponse("get ok!")

Asset.objects.get(id=id)与Asset.objects.filter(id__gt=id)的区别
get只能获取一条数据,若查询结果为空,则报错;filter可以获取多条数据,若查询结果为空,则返回空
get返回一个对象;filter返回多个对象的集合

<QuerySet [{‘id’: 1, ‘hostname’: ‘dfq’}, {‘id’: 2, ‘hostname’: ‘qwe’}, {‘id’: 4, ‘hostname’: ‘dayu3’}, {‘id’: 5, ‘hostname’: ‘dayu3’}]>
QuerySet属于Django框架定义的类,Django执行sql语句返回的结果将被封装在QuerySet类中。

模板语言

web views.py

def AssetList(request):
    asset_list = Asset.objects.all()
    #把数据嵌套在html中,将新的html返回给用户
    #使用"render_to_response"将数据嵌套至html中
    result =  render_to_response('assetlist.html', {'data':asset_list,'user':'dfq'})
    return result

web urls.py

urlpatterns = [
    path('assetList/',AssetList),
]

assetlist.html

<!doctype html>
<html>
    <head>
	    <!--对页面编码进行设置-->
	    <meta http-equiv="content-type" content="text/html;charset=utf-8">
		<!--兼容IE6浏览器-->
		<meta http-equiv="X-UA-Compatible" content="IE=Edge">
		<title>demo 10</title>
		<style>
			.hide{
			    display:none;
			}
			.clearfix:after{
			    content:".";
				display:block;
				height:0;
				clear:both;
				visibility:hidden;
			}
		</style>

	</head>
	<body>
	    <!--使用模板语言将后台传递的数据在HTML中显示。
		后台传递的数据是字典类型-->
		<h1>{{user}}</h1>
		<table border='1'>
			<!--模板语言的for循环-->
			{% for item in data %}
				<tr>
				    <td>{{item.id}}</td>
				    <td>{{item.hostname}}</td>
				    <td>{{item.create_date}}</td>
					<!--使用"date:"Y-m-d H:i:s""调整时间格式-->
				    <td>{{item.update_date|date:"Y-m-d H:i:s"}}</td>
			    </tr>
			{% endfor %}
			<!--模板语言的if else语句-->
			{% if user %}
			    <h2>zhen</h2>
			{%  else %}
			    <h2>jia</h2>
			{% endif %}
			<!--模板语言的ifequal语句-->
			{% ifequal user 'dfq' %}
			    <h2>zhen</h2>
			{%  else %}
			    <h2>jia</h2>
			{% endifequal %}
			<!--使用truncatewords,当字符串user大于2个字符时将被截断-->
			{{user|truncatewords:"2"}}
			<!--令字符串的首字母大写-->
			{{user|first|upper}}
			<!--令字符串字母大写-->
			{{user|upper}}
			{{user|lower}}

			
		</table>
		<!--引入jQuery文件-->
	    <script src="jquery-1.11.0.min.js"></script>
	    <





							
  • 作者:默行默致
  • 原文链接:https://blog.csdn.net/dfq737211338/article/details/100925807
    更新时间:2023-01-19 12:46:33