Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。
1.基本配置
- 终端命令:django-admin startproject sitename
- IDE创建Django程序时,本质上都是自动执行上述命令
其他常用命令:
python manage.py runserver 0.0.0.0
python manage.py startapp appname
python manage.py syncdb
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
2.程序目录
2.1 详细操作
# 创建Django工程
django-admin startproject 【工程名称】
mysite
- mysite # 对整个程序进行配置
- init
- settings # 配置文件
- url # URL对应关系
- wsgi # 遵循WSIG规范,uwsgi + nginx
- manage.py # 管理Django程序:
- python manage.py
- python manage.py startapp xx
- python manage.py makemigrations
- python manage.py migrate
# 运行Django功能
python manage.py runserver 127.0.0.1:8001
# 创建app
python manage.py startapp cmdb
python manage.py startapp openstack
python manage.py startapp xxoo....
#app目录:
migrations 数据修改表结构,记录修改表结构的记录
admin Django为我们提供的后台管理
apps 配置当前app
models ORM,写指定的类 通过命令可以创建数据库结构
tests 单元测试
views 业务代码
#配置文件(工程->settings)
#1、配置模板的路径(settings)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
#2、配置静态目录(settings)
static
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
<link rel="stylesheet" href="/static/commons.css" />
#3、配置数据库(settings)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'dbname',
'USER': 'root',
'PASSWORD': 'xxx',
'HOST': '',
'PORT': '',
}
}
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
# 如下设置放置的与project同名的配置的 __init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()
内容整理
1. 创建Django工程
django-admin startproject 工程名
2. 创建APP
cd 工程名
python manage.py startapp cmdb
3、静态文件
project.settings.py
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
4、模板路径
DIRS ==> [os.path.join(BASE_DIR,'templates'),]
5、settings中
middlerware
# 注释 csrf
3. 路由系统,URL
1、url(r'^index/', views.index),
url(r'^home/', views.Home.as_view()),
2、url(r'^detail-(\d+).html', views.detail),
3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
PS:
def detail(request, *args,**kwargs):
pass
实战:
a. detail-2-9.html
url(r'^detail-(\d+)-(\d+).html', views.detail),
def func(request, nid, uid):
nid=2,uid=9
pass
def func(request, *args):
args = (2,9)
def func(request, *args, **kwargs):
args = (2,9) kwargs={}
b. detail-2-9.html
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request, nid, uid):
nid=2,uid=9
pass
def funct(request, **kwargs):
kwargs = {'nid': 2, 'uid': 9}
def func(request, *args, **kwargs):
kwargs= {'nid': 2, 'uid': 9} args=()
示例1:
- urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('index/', views.index),
path('home/', views.Home.as_view()),
path('detail1/', views.detail1),
url('detail2-(\d+).html/', views.detail2),
]
- views.py
from django.shortcuts import render,redirect,HttpResponse
from django.views import View
import os
# Create your views here.
def login(request):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
sex=request.POST.get('gender',None)
love=request.POST.getlist('favor',None)
country= request.POST.get('country',None)
city = request.POST.getlist('city', None)
print(sex,love,country,city)
print('-----------我是可爱的分割线-------------')
obj = request.FILES.get('up_file',None)
print(obj,obj.name,type(obj))
filepath = os.path.join('upload/' + obj.name)
print(filepath)
f= open(filepath,'wb')
for item in obj.chunks():
f.write(item)
f.close()
return redirect('/index/')
else:
return render(request, 'login.html')
user_dict = {
'1':{'username':'root1','email':'hello@126.com','phonenumber':'123456789'},
'2':{'username':'root2','email':'hello@126.com','phonenumber':'123456789'},
'3':{'username':'root3','email':'hello@126.com','phonenumber':'123456789'},
'4':{'username':'root4','email':'hello@126.com','phonenumber':'123456789'},
'5':{'username':'root5','email':'hello@126.com','phonenumber':'123456789'},
}
def index(request):
return render(request,'index.html',{'user_dict':user_dict})
def detail1(request):
nid=request.GET.get('nid',None)
detail_info=user_dict[nid]
return render(request,'detail.html',{'detail_info':detail_info})
def detail2(request,nid):
detail_info=user_dict[nid]
return render(request,'detail.html',{'detail_info':detail_info})
class Home(View):
def get(self,request):
print(request.method)
return render(request,'home.html')
def post(self,request):
print(request.method)
return render(request,'home.html')
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>for循环字典</h4>
<ul>
{% for key in user_dict.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<br/>
<ul>
{% for value in user_dict.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
<br/>
<ul>
{% for key,value in user_dict.items %}
<li><a target="_blank" href="/detail1/?nid={{ key }}">{{ value.username }}</a></li>
{% endfor %}
</ul>
<br/>
<ul>
{% for key,value in user_dict.items %}
<li><a target="_blank" href="/detail2-{{ key }}.html">{{ value.username }}</a></li>
{% endfor %}
</ul>
</body>
</html>
4、 name 为路由映射设置名称
对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的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'),
#在views里生成自己想要的url,函数中使用生成URL
def func(request, *args, **kwargs):
from django.urls import reverse
url1 = reverse('i1') # asdfasdfasdf/
url2 = reverse('i2', args=(1,2,)) # yug/1/2/
url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
#在html里生成自己想要的url ,模板中使用生成URL
xxx.html
{% url "i1" %} # asdfasdfasdf/
{% url "i2" 1 2 %} # yug/1/2/
{% url "i3" pid=1 nid=9 %} # buy/1/9/
注:
# 当前的URL
request.path_info
5、多级路由
一级路由
project/urls.py
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^cmdb/', include("app01.urls")),
url(r'^monitor/', include("app02.urls")),
]
二级路由
app01/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^login/', views.login),
]
二级路由
app02/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app02 import views
urlpatterns = [
url(r'^login/', views.login),
]
6、默认值(欠)
7、命名空间(欠)
4. 视图函数
4、定义视图函数
app下views.py
4.1 获取用户请求数据
request.GET
request.POST
request.FILES
PS:
GET:获取数据
POST:提交数据
4.2 checkbox等多选的内容
request.POST.getlist()
4.3 上传文件
# 上传文件,form标签做特殊设置
obj = request.FILES.get('fafafa')
obj.name
f = open(obj.name, mode='wb')
for item in obj.chunks():
f.write(item)
f.close()
def func(request):
# request.method GET / POST
# http://127.0.0.1:8009/home?nid=123&name=alex
# request.GET.get('',None) # 获取请求发来的而数据
# request.POST.get('',None)
# request.POST.getlist('',None)
# return HttpResponse("字符串")
# return render(request, "HTML模板的路径")
# return redirect('/只能填URL')
示例:
#html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post" enctype="multipart/form-data">
<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="country" >
<option value="CN">中国</option>
<option value="SGP">新加坡</option>
</select>
</p>
<p>
城市:
<select name="city" multiple="multiple">
<option value="js">江苏</option>
<option value="zj">浙江</option>
<option value="sh">上海</option>
</select>
</p>
<p>
<input type="file" name="up_file"/>
</p>
<p>
<input type="submit" value="提交"/>
</p>
</form>
</body>
</html>
#views.py
from django.shortcuts import render,redirect
import os
# Create your views here.
def login(request):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
sex=request.POST.get('gender',None)
love=request.POST.getlist('favor',None)
country= request.POST.get('country',None)
city = request.POST.getlist('city', None)
print(sex,love,country,city)
print('-----------我是可爱的分割线-------------')
obj = request.FILES.get('up_file',None)
print(obj,obj.name,type(obj))
filepath = os.path.join('upload/' + obj.name)
print(filepath)
f= open(filepath,'wb')
for item in obj.chunks():
f.write(item)
f.close()
return redirect('/index/')
else:
return render(request, 'login.html')
def index(request):
return render(request,'index.html')
运行结果:
None ['11', '22', '33'] SGP ['zj', 'sh']
-----------我是可爱的分割线-------------
zhu捕获.PNG zhu捕获.PNG <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
upload/zhu捕获.PNG
4.1 FBV & CBV
4.1.1 FBV
FBV-function base view
url.py
index -> 函数名
view.py
def 函数(request):
4.1.2 CBV
CBV-class base view
url.py
/index/ -> 函数名
view.py
/index/ -> 类
**示例:
url.py**
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('index/', views.index),
path('home/', views.Home.as_view()),
]
view.py
from django.shortcuts import render,redirect,HttpResponse
from django.views import View
class Home(View):
def get(self,request):
print(request.method)
return render(request,'home.html')
def post(self,request):
print(request.method)
return render(request,'home.html')
5.模板渲染
5、模板渲染
特殊的模板语言
-- {{ 变量名 }}
def func(request):
return render(request, "index.html", {'current_user': "alex"})
index.html
<html>
..
<body>
<div>{{current_user}}</div>
</body>
</html>
====> 最后生成的字符串
<html>
..
<body>
<div>alex</div>
</body>
</html>
-- For循环
def func(request):
return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})
index.html
<html>
..
<body>
<div>{{current_user}}</div>
<ul>
{% for row in user_list %}
{% if row == "alex" %}
<li>{{ row }}</li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
#####索引#################
def func(request):
return render(request, "index.html", {
'current_user': "alex",
'user_list': ['alex','eric'],
'user_dict': {'k1': 'v1', 'k2': 'v2'}})
index.html
<html>
..
<body>
<div>{{current_user}}</div>
<a> {{ user_list.1 }} </a>
<a> {{ user_dict.k1 }} </a>
<a> {{ user_dict.k2 }} </a>
</body>
</html>
###### 条件
def func(request):
return render(request, "index.html", {
'current_user': "alex",
"age": 18,
'user_list': ['alex','eric'],
'user_dict': {'k1': 'v1', 'k2': 'v2'}})
index.html
<html>
..
<body>
<div>{{current_user}}</div>
<a> {{ user_list.1 }} </a>
<a> {{ user_dict.k1 }} </a>
<a> {{ user_dict.k2 }} </a>
{% if age %}
<a>有年龄</a>
{% if age > 16 %}
<a>老男人</a>
{% else %}
<a>小鲜肉</a>
{% endif %}
{% else %}
<a>无年龄</a>
{% endif %}
</body>
</html>
- for 循环字典
view.py
#####for 循环字典
user_dict = {
'1':'root1',
'2':'root2',
'3':'root3',
'4':'root4',
'5':'root5',
}
def index(request):
return render(request,'index.html',{'user_dict':user_dict})
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>for循环字典</h4>
<ul>
{% for key,row in user_dict.items %}
<li>{{ key }}-{{ row }}</li>
{% endfor %}
</ul>
<br/>
<ul>
{% for key in user_dict.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<br/>
<ul>
{% for value in user_dict.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
</body>
</html>