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(模 ...
随机推荐
- jq封装淘宝图片轮播插件
<!DOCTYPE html><head><meta http-equiv="Content-Type" content="text/htm ...
- from表单提交数组
页面代码: function submitForm(){ var categoryArray = new Array(); var $ss = $("select[name=industry ...
- MySQL、MongoDB、Redis数据库Docker镜像制作
MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...
- CVE-2016-1240 Tomcat 服务本地提权漏洞
catalogue . 漏洞背景 . 影响范围 . 漏洞原理 . 漏洞PoC . 修复方案 1. 漏洞背景 Tomcat是个运行在Apache上的应用服务器,支持运行Servlet/JSP应用程序的容 ...
- Linux创建WiFi热点
手机流量用完,需要开WiFi,由于是LinuxMint,感觉配置还算容易,找到一个不错的教程,收藏一下,以备后用.除了修改配置文件那步在我的电脑不需要外其他基本正确,而且Mint本来就衍生自Ubunt ...
- Cookie和Session的区别
前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...
- centos6.5 卸载php
1.删除php,删除之前需要查看php依赖包,使用 rpm -qa|grep php [root@localhost ~]# rpm -qa |grep phpphp55w-mysql-5.5.38- ...
- windows server 2012 使用问题
1.端口映射,把宿主机的端口映射到hyper-v创建的虚拟机上 访问宿主机的公网IP的某个端口,就等于访问这个虚拟机上的端口 具体实现: 在宿主机上命令行输入 添加一个端口映射 netsh inter ...
- select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...
- 手机通过数据线连接电脑后,找不到设备--Android Studio
手机通过数据线连接电脑后,找不到可用的设备.允许USB调试,,因为小米手机还要设置USB开发者模式. 1.打开设置/关于手机 四次点击“MIUI版本”如图: 2.返回上一页打开更多设置 看到开发者选项 ...