Django (2)
一.Django基本 程序编写
a. url.py /index/ -> func
b. views.py
def func(request): # 包含所有的请求数据
...
return HttpResponse('字符串')
return render(request, 'index.html', {'替换':替换})
retrun redirect('URL')
c. 模板语言
return render(request, 'index.html', {'li': [11,22,33]})
{% for item in li %}
<h1>{{item}}</h1>
{% endfor %}
*********** 索引用点 **********
<h2> {{item.0 }} </h2>
二 视图函数 views.py
1、获取用户请求数据
request.GET
request.POST
request.FILES 获取文件
PS:
GET:获取数据 刷新的时候都是get
POST:提交数据
2、checkbox、radio等多选的内容
request.POST.getlist()
3、上传文件
# 上传文件,form标签做特殊设置 <form action="/login/" method="POST" enctype="multipart/form-data">
obj = request.FILES.get('fafafa')
f = open(obj.name, mode='wb')
for item in obj.chunks():
f.write(item)
f.close()
示例:
多选框html示例
<body> <form action="/login/" method="POST" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名" /> </p> <p> <input type="password" name="pwd" placeholder="密码" /> </p> <p> 男:<input type="radio" name="gender" value="1"/>单选 女:<input type="radio" name="gender" value="2"/> 张扬:<input type="radio" name="gender" value="3"/> </p> <p> 男:<input type="checkbox" name="favor" value="11"/>多选 女:<input type="checkbox" name="favor" value="22"/> 张扬:<input type="checkbox" name="favor" value="33"/> </p> <p> <select name="city" multiple> 多选 <option value="sh">上海</option> <option value="bj">北京</option> <option value="tj">天津</option> </select> </p> <p> <input type="file" name="fafafa"/> </p> <input type="submit" value="提交"/> </form> </body>
数据获取方式:获取多个用getlist;上传文件
def login(request): if request.method == "GET": return render(request, 'login.html') elif request.method == "POST": # radio 获取单个value # v = request.POST.get('gender') # print(v) #checkbox多选 获取多个value # v = request.POST.getlist('favor') # print(v) # v = request.POST.get('fafafa') # print(v) #获取文件 obj = request.FILES.get('fafafa') #'fafafa'是html中的name print(obj,type(obj),obj.name) import os file_path = os.path.join('upload', obj.name)#指定文件存放目录 f = open(file_path, mode="wb") for i in obj.chunks(): #chunks是method的一个函数,它存放上传的文件,可以从它里边取数据 f.write(i) f.close() from django.core.files.uploadedfile import InMemoryUploadedFile return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect('/index/')
三、Django两种模式 FBV & CBV (function Base view) & (class Base view)
两者的主要区别就是 urls.py 与views.py
urls.py
1 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/', views.home), #url直接指向函数 url(r'^home/', views.Home.as_view()), #url指向Home类,这是固定写法
url(r'^detail-(\d+)-(\d+).html', views.detail),#动态url,利用正则匹配一类url,html格式如:detail-1-2.html ]
views.py
# def home(request): #FBV # if request.method == 'get': # return HttpResponse('Home') # if request.method == 'post': # return HttpResponse('Home') from django.views import View #CBV 必须要有这个,必须导入父类View class Home(View): # dispatch相当于助理,自动将请求分配给不同的函数来处理 def dispatch(self, request, *args, **kwargs): #继承的View父类中有dispatch方法,这里重写这个方法,请求最先到这个函数 print('before')#增加新的功能print # 调用父类中的dispatch,反射,根据请求中的字符串,来使用不同的函数来处理请求 result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result #这里必须返回result def get(self,request): #如果是get请求,自动执行get函数 print(request.method) return render(request, 'home.html') def post(self,request): #如果是post请求,自动执行post函数 print(request.method,'POST') return render(request, 'home.html')
四、Django模板语言循环字典
{% for key,value in user_dict.items %} {{key}}--{{value}} {% endfor %} 注意,模板语言里key value items都没有括号,这里user_dict是字典
五、路由系统url匹配的三种方式
1.匹配一类url,并将url中的参数赋给相应变量(正则)
urls.py
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail), 对于接收到并匹配的url:xxx/detail-3-6.html,会将第一个3赋给nid(因为nid在第一个),6赋给uid,并以(nid=3,uid=6)这样的形式传给views.py
views.py
def detail(request, nid,uid): print(nid,uid) return render(request, 'user_detail.html', {'obj': obj}) 不论nid和uid这俩变量的位置怎样变化,从urls.py接收到的数据永远是nid=3,uid=6
优化:
def detail(request, *args,**kwargs): #不论url中有多少参数,形如url(r'^detail-(\d+).html', views.detail)这样的url,
会将参数传递给*args;形如url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)这样的url会将参数传递给**kwargs,
**kwargs只接收字典参数(nid=3,uid=6)
print(args) 获取单个参数,这里是获取到一个元组(1,2,3,4)
print(kwargs)获取到字典参数 {'nid':3,'uid':9}
nid = kwargs['nid'] #获取字典参数
uid = kwargs['uid']
2.一 一对应:
url(r'^index/', views.index), #FBV url(r'^home/', views.Home.as_view()), #CBV
3.匹配一类url(正则)
url(r'^detail-(\d+).html', views.detail),
六、Django对应的路由名称,生成自定义url
由于业务需要,可能经常要更改url,导致html中的action也要做出相应改变,应用name属性后,就不用这么麻烦了
name对URL路由关系进行命名, ***** 以后可以根据name生成自己想要的URL *****
有以下三种命名方式:
url(r'^asdfasdfasdf/', views.index, name='i1'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
生成自定义url的两种方式:
第一种,可以通过views.py函数生成
通过views.py中的函数来生成相应url
def func(request, *args, **kwargs):
from django.urls import reverse#需要导入reverse这个模块,通过name反解url
url1 = reverse('i1') # asdfasdfasdf/
url2 = reverse('i2', args=(1,2,)) # 生成yug/1/2/ reverse模块只能获取到/前边的内容,
后边的只能加自定义参数
url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
第二种,通过模板语言来生成
xxx.html
<form action="{ % url 'i1' % }" method="post"> #实际用法
{% url "i1" %} # asdfasdfasdf/
{% url "i2" 1 2 %} # yug/1/2/
{% url "i3" pid=1 nid=9 %} # buy/1/9/
注:
# 获取当前的URL用
request.path_info
七、路由分发,在project的urls.py中指定app的urls
#project urls.py
#project urls.py from django.conf.urls import url,include #需要include模块 from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^cmdb/', include("app01.urls")), #指定app路由 url(r'^monitor/', include("app02.urls")), ]
#app1 urls.py
from app01 import views urlpatterns = [ url(r'^login/', views.login), url(r'^index/', views.index), ]
#app1 urls.py
from app01 import views urlpatterns = [ url(r'^login/', views.login), url(r'^index/', views.index), ]
八、Django创建表,使用mysql
1.setting.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
2.创建数据库表步骤
a. 先写类,在app下的modules中 from django.db import models # app01_userinfo : 在数据库中生成的表名 class UserInfo(models.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 username = models.CharField(max_length=32) password = models.CharField(max_length=64) b. 注册APP INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ] c. 执行命令 python manage.py makemigrations python manage.py migrate d. ********** 注意 *********** Django默认使用MySQLdb模块链接MySQL,由于只有pymyql支持python3,所以要修改为使用pymysql:在project同名文件夹下的__init__文件中添加如下代码即可: import pymysql #注意要用最新版本,0.7版 pymysql.install_as_MySQLdb() e. 根据类自动创建数据库表 # app下的models.py python manage.py makemigrations python manage.py migrate
九.Django增删改查
在app的views.py中创建一个orm函数,这些语句也可以直接在其他函数中使用,只需要models模块即可
from app01 import models def orm(request): # 创建,推荐用1和2两种建表方式 models.UserInfo.objects.create(username=') dic = {'} models.UserInfo.objects.create(**dic) # obj = models.UserInfo(username='alex',password='123') # obj.save() # 查 result = models.UserInfo.objects.all() 查询全部 result = models.UserInfo.objects.filter(username=') 条件查询,相当于where
models.User.objects.filter(id=1,name='root')#相当于and查询
models.User.objects.filter(id__lt=1) #条件查询,id < 1
models.User.objects.filter(id__gte=1) #条件查询,id > 1
models.User.objects.filter(id__gte=1) #条件查询,id >= 1
models.User.objects.filter(id__lte=1) #条件查询,id <= 1
dic = {'name': 'xx', 'age__gt': 19} #以字典形式查询
models.User.objects.filter(**dic) # # Django 查询到的结果是QuerySet ,它是一个列表[] # [obj(id,username,password),obj(id,username,password), obj(id,username,password)] for row in result: print(row.id,row.username,row.password) print(result) # 删除 models.UserInfo.objects.filter(username="alex").delete() # 更新 models.UserInfo.objects.filter(id=3).update(password=") #按条件更改
models.UserInfo.objects.all().update(password="69") #更改全部password="69"的
dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic) #以字典形式更改
十、基于orm实现用户登录审查,从页面实现增删改查
views.py
from django.shortcuts import render,HttpResponse,redirect from app01 import models def login(request): models.UserGroup.objects.create(caption='DBA') if request.method == "GET": return render(request, 'login.html') elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') obj = models.UserInfo.objects.filter(username=u, password=p).first() if obj: #如果能查询到数据,则为true return redirect('/cmdb/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect('/index/') def index(request): return render(request, 'index.html') def user_info(request): if request.method == "GET": #获取用户与组 user_list = models.UserInfo.objects.all() group_list = models.UserGroup.objects.all() return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list}) elif request.method == 'POST': #增加用户 u = request.POST.get('user') p = request.POST.get('pwd') models.UserInfo.objects.create(username=u,password=p) return redirect('/cmdb/user_info/') # user_list = models.UserInfo.objects.all() # return render(request, 'user_info.html', {'user_list': user_list}) def user_detail(request, nid):#查询用户详细信息 obj = models.UserInfo.objects.filter(id=nid).first() # 下面这句是取单条数据,如果不存在,直接报错 # models.UserInfo.objects.get(id=nid) return render(request, 'user_detail.html', {'obj': obj}) def user_del(request, nid): #删除用户 models.UserInfo.objects.filter(id=nid).delete() return redirect('/cmdb/user_info/') #跳转回用户信息界面 def user_edit(request, nid): #编辑页面 if request.method == "GET": obj = models.UserInfo.objects.filter(id=nid).first() return render(request, 'user_edit.html',{'obj': obj}) elif request.method == "POST": nid = request.POST.get('id') u = request.POST.get('username') p = request.POST.get('password') models.UserInfo.objects.filter(id=nid).update(username=u,password=p) return redirect('/cmdb/user_info/')
html
登录
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/cmdb/login/" method="POST" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名" /> </p> <p> <input type="password" name="pwd" placeholder="密码" /> </p> <input type="submit" value="提交"/> </form> </body> </html>
用户信息
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin: 0; } .menu{ display: block; padding: 5px; } </style> </head> <body> <div style="height: 48px;background-color: black;color: white"> 张扬凌晨三点玩愤怒的小鸟 </div> <div> <div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;"> <a class="menu" href="/cmdb/user_info/">用户管理</a> <a class="menu" href="/cmdb/user_group/">用户组管理</a> </div> <div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h3>添加用户</h3> <form method="POST" action="/cmdb/user_info/"> <input type="text" name="user" /> <input type="text" name="pwd" /> <select name="group_id"> {% for item in group_list %} <option value="{{ item.uid }}">{{ item.caption }}</option> {% endfor %} </select> <input type="submit" value="添加"/> </form> <h3>用户列表</h3> <ul> {% for row in user_list %} <li> <a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a> | <span> {{ row.user_group.caption }} </span> <a href="/cmdb/userdel-{{ row.id }}/">删除</a> | <a href="/cmdb/useredit-{{ row.id }}/">编辑</a> </li> {% endfor %} </ul> </div> </div> </body> </html>
单个用户详细信息
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin: 0; } .menu{ display: block; padding: 5px; } </style> </head> <body> <div style="height: 48px;background-color: black;color: white"> 张扬凌晨三点玩愤怒的小鸟 </div> <div> <div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;"> <a class="menu" href="/cmdb/user_info/">用户管理</a> <a class="menu" href="/cmdb/user_group/">用户组管理</a> </div> <div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h1>用户详细信息</h1> <h5>{{ obj.id }}</h5> <h5>{{ obj.name }}</h5> <h5>{{ obj.password }}</h5> </div> </div> </body> </html>
用户编辑
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin: 0; } .menu{ display: block; padding: 5px; } </style> </head> <body> <div style="height: 48px;background-color: black;color: white"> 张扬凌晨三点玩愤怒的小鸟 </div> <div> <div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;"> <a class="menu" href="/cmdb/user_info/">用户管理</a> <a class="menu" href="/cmdb/user_group/">用户组管理</a> </div> <div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h1>编辑用户</h1> <form method="post" action="/cmdb/useredit-{{ obj.id }}/"> <input style="display: none" type="text" name="id" value="{{ obj.id }}" /> <input type="text" name="username" value="{{ obj.username }}" /> <input type="text" name="password" value="{{ obj.password }}"/> <input type="submit" value="提交" /> </form> </div> </div> </body> </html>
urls.py
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^login/', views.login), url(r'^index/', views.index), url(r'^user_info/', views.user_info), url(r'^userdetail-(?P<nid>\d+)/', views.user_detail), url(r'^userdel-(?P<nid>\d+)/', views.user_del), url(r'^useredit-(?P<nid>\d+)/', views.user_edit), url(r'^orm/', views.orm), ]
十一、Django建表更多字段,主要是给admin用的
1、models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 2、models.CharField 字符串字段 必须 max_length 参数 3、models.BooleanField 布尔类型=tinyint(1) 不能为空,Blank=True 4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar 继承CharField,所以必须 max_lenght 参数 5、models.DateField 日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。 6、models.DateTimeField 日期类型 datetime 同DateField的参数 7、models.Decimal 十进制小数类型 = decimal 必须指定整数位max_digits和小数位decimal_places 8、models.EmailField 字符串类型(正则表达式邮箱) =varchar 对字符串进行正则表达式 9、models.FloatField 浮点类型 = double 10、models.IntegerField 整形 11、models.BigIntegerField 长整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 12、models.IPAddressField 字符串类型(ip4正则表达式) 13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的) 参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置报错 14、models.NullBooleanField 允许为空的布尔类型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 减号、下划线、字母、数字 18、models.SmallIntegerField 数字 数据库中的字段有:tinyint、smallint、int、bigint 19、models.TextField 字符串=longtext 20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正则表达式 22、models.BinaryField 二进制 23、models.ImageField 图片 24、models.FilePathField 文件 更多字段
创建 Django 用户:python manage.py createsuperuser
十二、建表的字段参数,即后边括号里的参数
caption = models.CharField(max_length=32,unique=True)
字段的参数: null -> db是否可以为空 default -> 默认值 primary_key -> 主键 db_column -> 列名 db_index -> 索引 unique -> 唯一索引 unique_for_date -> unique_for_month unique_for_year auto_now -> 创建时,自动生成时间 auto_now_add -> 更新时,自动更新为当前时间 # obj = UserGroup.objects.filter(id=1).update(caption='CEO') # obj = UserGroup.objects.filter(id=1).first() # obj.caption = "CEO" # obj.save() choices -> django admin中显示下拉框,避免连表查询 blank -> django admin是否可以为空 verbose_name -> django admin显示字段中文 editable -> django admin是否可以被编辑 error_messages -> 错误信息欠 error_messages={"required": "密码不能为空",} help_text -> django admin提示
示例:
class UserInfo(models.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 # 字符串、数字、时间、二进制 username = models.CharField(max_length=32,blank=True,verbose_name='用户名') password = models.CharField(max_length=60, help_text='pwd') email = models.CharField(max_length=60) test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'}) # user_group_id 数字 user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew) user_type_choices = ( #这个不存在表里,是存在内存里,在admin界面会显示下拉框 (1, '超级用户'), (2, '普通用户'), (3, '普普通用户'), ) user_type_id = models.IntegerField(choices=user_type_choices,default=1)
十三、外键关联
会自动创建5列
class UserInfo(models.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 # 字符串、数字、时间、二进制 username = models.CharField(max_length=32,blank=True,verbose_name='用户名') password = models.CharField(max_length=60, help_text='pwd') email = models.CharField(max_length=60) test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码', },)#注意逗号 # 创建user_group这一列时,Django自动将列名改为user_group_id ,这一列中就是存的user_group表中uid的数字 user_group = models.ForeignKey("UserGroup",to_field='uid') #user_group :要关联的表, “to_field:要关联的字段”, 还可以设置默认值:该默认值是指的user_group 中to_field的值
注意:在创建的表中还存在user_group对象,只是不可见,通过循环,还可以取user_group表中所有的值
例:
result = models.UserInfo.objects.all() for row in result: print(row) #此时row中包含userinfo表的所有字段,还包括user_group表的对象,即: [username,password,email,test,user_group_id,user_group对象] print(row.username)#打印表中的username字段 print(user_group.uid)#打印user_group表中的uid字段,还可以打印它的其他字段(uid,catption,ctime,uptimew)
十四、一对多,利用外键增加用户,详见s19—-19视频
Django (2)的更多相关文章
- Django(三) 模型:ORM框架、定义模型类并创建一个对应的数据库、配置Mysql数据库
一.模型概述 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/ https://www.runoob.com/django/dj ...
- CentOS下 Django部署 nginx+uWSGI+Django(二)
该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...
- Python攻关之Django(一)
课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...
- django(一)
Django 自称是"最适合开发有限期的完美WEB框架".本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明, ...
- Django(四)
一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResp ...
- Django(三)
1.Django请求的生命周期 路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户 2.路由系统 /index/ ...
- Django(二)
一.路由系统,URL 1.url(r'^index/', views.index), url(r'^home/', views.Home.as_view()), 2. ...
- Python后台开发Django(数据库)
如果使用pymysql,则可以在view中直接import pymysql进行操作,与原操作无区别 Django数据库框架支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在s ...
- Python后台开发Django(启动)
Django版本为:2.1.7 Python的web框架,MTV思想 MVC Model(模板文件,数据库操作) view(视图模板文件 )controller(业务处理) MTV Model(模 ...
随机推荐
- Android 样式 (style) 和主题(theme)
转载:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2 样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字 ...
- (转)gulp使用
前端构建工具gulpjs的使用介绍及技巧 gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nod ...
- mui 下拉刷新
mui 下拉刷新 此文提供的是mui这种下拉刷新.悬浮于页面上,比较好用. <!DOCTYPE html> <html> <head> <meta chars ...
- lightbox使用
使用方法: 1.在页面头部包含 lightbox.js 文件并加载 lightbox.css 样式表文件 <script type="text/javascript" src ...
- C#并发编程
并发编程,一直是小白变成(●—●)的一个坎.平时也用到过不少并发编程操作,在这里进行一下记录. 多线程并不是唯一 并发:同时做多件事情. 多线程:并发的一种形式,采用多线程来执行程序. 并行处理:把正 ...
- 【原创】自己动手写工具----XSmartNote [Beta 1.0]
一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这 ...
- python笔记1-转义字符
print(r'dd"e"f')print(r'dd'e'f')print(r"dd"e"f")print(r"dd'e'f&qu ...
- RF Firefox Profile
默认情况下,robot framework是启动不带任何配置信息的firefox,如果需要启动带有profile的话,增加一个参数即可,如 Open Browser https://aws-qa5.i ...
- Mac 配置 php-fpm 时出现'/private/etc/php-fpm.conf': No such file or directory (2)
https://github.com/musicode/test/issues/5 Mac 自带 php-fpm,在终端执行 php-fpm,会报如下错误: ERROR: failed to open ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...