人生苦短,我用python-- Day18 正则+组件+django框架
目录
1.正则表达式
2.组件
3.django框架
一、正则表达式
作用:1,判断字符串是否符合规定的正则表达式 ----test
2,获取匹配的数据 exec
用户登录的时候 常常需要用到正则进行匹配用户输入的是否符合要求:
实验案例一:判断字符串是否符合定义的正则表达式要求
exec 使用方法:
rep = /\d+/; 定义一个正则表达式,匹配数字
str = "DongGuang_061600_BeiJing_10000" 定义一个字符串
rep.exec(str) 使用rep正则表达式匹配str这个字符串中符合的数据
# ["67"] 结果明显看出,使用这种方式,无论执行几次都是获取第一个数据
str = 'JavaScript is more fun than Java or JavaBeans!' 定义一个字符串
var pattern = /Java\w*/; 定义一个正则规则,\w的意思是陪陪一Java开头的一个单词
pattern.exec(str)
["JavaScript"]
str = 'JavaScript is more fun than Java or JavaBeans!' 定义一个字符串 var pattern = /\bJava(\w*)\b/; 定义一个正则规则,这里把上面的\w*括起来的其意思是,当获取到第一次匹配后,会把结果再次进行匹配,把第一次匹配的内容去除
剩余的内容当做第二次匹配的结果 pattern.exec(str) ["JavaScript", "Script"]
全局匹配
关键参数g
str = 'JavaScript is more fun than Java or JavaBeans!' 定义一个字符串 var pattern = /\bJava(\w*)\b/g; 定义一个正则规则,在上一个的基础上加了一个g,意思是当每次执行这个正则的时候,都会筛选下一个选择,当执行到最后一个,没有匹配到结果为null pattern.exec(str) ["JavaScript", "Script"] pattern.exec(str) ["Java", ""] pattern.exec(str) ["JavaBeans", "Beans"] pattern.exec(str) null
多行匹配
关键参数 m
str = 'JavaScript is more fun than \nJava or JavaBeans!' #定义一个字符串,其中有一个换行符号 "JavaScript is more fun than Java or JavaBeans!" var pattern = /^Java\w*/g; #定义一个正则表达式,全局匹配开头为Java的单词 undefined pattern.exec(str) #第一次匹配结果 ["JavaScript"] pattern.exec(str) #第二次匹配结果 null pattern.exec(str) #第三次匹配结果 ["JavaScript"] pattern.exec(str) #第四次匹配结果 null var pattern = /^Java\w/gm; #定义一个正则表达式,全局多行匹配开头为Java, undefined pattern.exec(str) ["JavaScript"] pattern.exec(str) ["Java"]
不区分大小写匹配
关键参数 i
响应式:
响应式html编程大概意思是当浏览器的宽度到达某个程度的时候,css中的某个样式生效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .c1{ background-color: red; } /*c1这个div最小像素是500,当宽度小于500px的时候,此样式不生效*/ @media (min-width: 500px) { .c1{ background-color: green; } } </style> </head> <body style="margin: auto"> <div class="c1"> 1 </div> </body> </html>
三、django框架的安装及使用
1.django安装
pip3 install django
2.创建一个工程
django-admin startproject management_system
django-admin startproject 项目名称
3.启动工程
cd management_system # 进入到项目目录
python3 manage.py runserver #启动项目
如果不指定端口默认启动端口为127.0.0.1:8000端口
也可以指定端口
python3 manage.py runserver 127.0.0.1:8001
4.web访问
5.目录介绍
-management_system 项目名称
|--management_system #对整个程序进行配置
-__init__.py
-settings.py # 配置文件,配置数据库连接、模板连接等等
-urls.py # URL和函数对应关系,当用户来访问程序的是,就会根据url进行匹配
-wsgi.py # 首先wsgi是一套规则,django是一个web框架不负责给我创建socket连接,所以这里调用wsgi模块进行socket的创建,我们代码只需
要进行编写函数,处理wsgi传过来的数据就可以了。
-manage.py # 管理django程序的:
1.python manage.py runserver 启动django
2.python manage.py startapp APP名称 创建app程序(可以理解为子模块)
3.python manage.py makemigrations
python manage.py mingrate 通过这两个命令可以连接数据库,创建表
6.创建工程pycharm也可以帮我们创建,这样创建和我们使用命令创建是一个效果
7.写一个测试页面的html,http://127.0.0.1:8000/test.html
"""management_system URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse def test(request): return HttpResponse('<h1>This is a test pag!</h1>') urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test.html/', test), ]
效果:
8.创建一个app
当写一个网站的时候,往往会有很多模块,上面的app其实就是模块的概念,看下图:
当我写一个运维平台的是,可能会有这么的模块,那么每个模块我们叫做一个app,这样就实现了代码分离,数据库共享的效果!
win下面创建app没有什么好的办法,需要我们使用命令:
python manage.py startapp APP名称
mac下面创建app有一个快捷键,option+r,然后直接输入startapp APP名称
9.app目录介绍
APP目录
|--migrations 数据库操作记录目录
--__init__.py
--admin.py #django后台管理配置
--apps.py # 配置当前app
--models.py # django后台管理数据库表管理文件,创建指定的类,models可以创建表结构
--tests.py # 单元测试
--views.py # 写和当前app相关的所有业务代码
10.django的html模板目录的配置
依次找到:工程目录-->settings.py文件 修改TEMPLATES列表中的DIRS对应的值为“[os.path.join(BASE_DIR,'创建的模板目录名字')]”
11.django的静态文件目录的配置
依次找到:工程目录-->settings.py文件 最后面增加STATUICFILES_DIRS ,切记最后一定要逗号
STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
12. django返回数据的时候如果返回一个html的时候,我们的想法是,打开一个html读出数据来,把整个数据返回给客户端,但是这种模式假如有好多访问需要不断
的我们来打开文件,这样很麻烦;django后来给我们封装了一个方法我们引入render这个方法进行返回就行了,其实他内部也是打开返回这么操作的。
from django.shortcuts import render
假如我们要重定向到另外一个网站的时候:就需要引入我redirect这个方法进行返回
from django.shortcuts import redirect
我们来梳理一下一个请求过来大致的流程:
说一个html里面嵌套关键字的方法使用大括号:
在这个body标签中有一个{{error_msg}}的关键字,这个error_msg是自己定义的,但是两个大括号是固定格式,当要把这个html返回给浏览器的时候django自己会先把html解析一遍(说白了就是把一些关键字替换一遍);那么替换成什么呢?
可以看到如果跳转失败了,那么后台会定义一变量error_msg = ‘用户名密码错误’,然后return 一个html,并且会把这个error_msg当做一个值传过去。然后django就会在html进行替换前面定义的关键字了
模板循环:
返回的参数
USER_LIST = [ {'username':'alex','email':'alex3714@163.com','gender':'男'}, {'username':'eriuc','email':'yinjiao@163.com','gender':'男'}, {'username':'tom','email':'tom@163.com','gender':'女'}, return render(request, 'home.html', {'user_list': USER_LIST})
html模板拿到user_list数据后,进行循环,每个row是一个字典,模板语言拿字典中的数据的时候,用点进行拿
{% for row in user_list %} <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %}
本节django使用的的代码案例:
"""onedjango URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^cmdb.html/', views.Cmdb), url(r'^login.html', views.login), url(r'^home.html/', views.home), ]
from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render from django.shortcuts import redirect def Cmdb(request): return HttpResponse('<h1>CMDB</h1>') def login(request): error_msg = "" if request.method == 'POST': user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == '123': return redirect('http://www.baidu.com') else: error_msg = '用户名密码错误' return render(request,'login.html',{'error_msg':error_msg}) USER_LIST = [ {'username':'alex','email':'alex3714@163.com','gender':'男'}, {'username':'eriuc','email':'yinjiao@163.com','gender':'男'}, {'username':'tom','email':'tom@163.com','gender':'女'}, ] def home(request): print(request.method) if request.method == "POST": print('aaa') # 获取用户提交的数据 u = request.POST.get('username') e = request.POST.get('email') g = request.POST.get('gender') tmp ={'username': u, 'gender': g,'email': e} print(tmp) USER_LIST.append(tmp) print(USER_LIST) return render(request, 'home.html', {'user_list': USER_LIST})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <form action="/home.html/" method="post"> <input type="text" name="username" placeholder="用户名" /> <input type="text" name="email" placeholder="邮箱"/> <input type="text" name="gender" placeholder="性别"/> <input type="submit" value="添加" /> </form> </div> <div> <table> {% for row in user_list %} <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %} </table> </div> </body> </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <link rel="stylesheet" href="/static/commons.css"> 7 <style> 8 label{ 9 width: 80px; 10 text-align: right; 11 display: inline-block; 12 } 13 </style> 14 </head> 15 <body> 16 <form action="/login.html" method="post"> 17 <p> 18 <label for="username">用户名:</label> 19 <input id="username" type="text" name="user"/> 20 </p> 21 <p> 22 <label for="password">密码:</label> 23 <input id="password" type="password" name="pwd"/> 24 <input type="submit" value="提交" /> 25 <span style="color: red;">{{ error_msg }}</span> 26 </p> 27 </form> 28 </body> 29 </html>