Django_概述

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值