Django框架 (一) 虚拟环境配置及简单使用
虚拟环境
什么是虚拟环境
对真实的python解释器的一个拷贝版本 是事实有效的,可以独立存在运行解释python代码 可以在计算机上拷贝多个虚拟环境
为什么要使用虚拟环境
保证真实环境的纯净性 框架的多版本共存 方便做框架的版本迭代 降低多框架共存的维护成本
安装虚拟环境
1.通过pip3安装虚拟环境: -- pip3 install virtualenv 2.前往目标文件夹: -- cd 目标文件夹 (D:\Virtualenv) 3.创建纯净虚拟环境: -- virtualenv 虚拟环境名 (py3-env1) 4.终端启动虚拟环境: -- cd py3-env1\Scripts -- activate 5.进入虚拟环境下的python开发环境 -- python3 6.关闭虚拟环境: -- deactivate 7.PyCharm的开发配置 添加:创建项目 -> Project Interpreter -> Existing interpreter -> Virtualenv Environment | System Interpreter -> 目标路径下的python.exe 删除:Setting -> Project -> Project Interpreter -> Show All
web架构
web应用 架构
C/S 架构 | B/S 架构 client server: 客户端服务器架构,C++ browser server:浏览器服务器架构,Java、Python
原生socket
完成B/S架构项目的设计
Borwser已经完成
Server需要手动书写socket,以http协议方式完成响应
import socket
# 设置响应头(包含响应行)
RESP_HEADER = b'HTTP/1.1 200 OK\r\nContent-type:text/html;charset=utf-8\r\n\r\n'
# 设置服务器socket相关信息
server = socket.socket()
server.bind(('localhost', 8808))
server.listen(5)
print("服务: http://localhost:8808")
while True:
# 获取B以http协议发来的请求
client, address = server.accept()
data = client.recv(1024)
# 数据报文 包含 请求行 请求头 请求体
print(data)
# 手动以http协议完成响应
# 数据报文 包含 响应行 响应头 响应体
client.send(RESP_HEADER)
# /index => 响应主页
# /login => 登录页面
# 错误 => 404
# 数据data, 字节形式 => 字符串形式
strData = str(data, encoding='utf-8')
# 解析请求的数据, 分析得到路由
my_route = strData.split('\r\n')[0].split(' ')[1]
# 后台没有设置的路由,统统以404来处理
dt = b'404'
# 设置的路由返回响应的页面文件
if my_route == '/index':
with open('02_index.html', 'rb') as f:
dt = f.read()
if my_route == '/login':
with open('02_login.html', 'rb') as f:
dt = f.read()
# /favicon.ico该请求是往后台请求标签图标
if my_route == '/favicon.ico':
with open('favicon.ico', 'rb') as f:
dt = f.read()
# 响应体
client.send(dt)
# 一次循环,代表一次响应,也就是一次事务的完成, 要关闭http请求连接
client.close()
Django环境安装
安装python3.6版本:官网下载python3.6安装包,安装本地,并配置环境变量 安装Django1.11.9版本:官网查看Django个版本特性
终端安装Django
安装命令:pip3 install django==1.11.9 查看版本:django-admin --version
pycharm可视化安装
项目设置下Project Interpreter下为python3.6版本安装 搜索Django包,并选取对应版本号
创建项目
终端创建
1、指定目录下:cd 目标路径 2、创建django项目:django-admin startproject 项目名 3、进入项目目录:cd 项目名 4、启动项目:python3 manage.py runserver 127.0.0.1:8000 5、停止项目:Ctrl + c
pycharm创建(略)
项目目录
-- __init__.py:模块的配置文件,将blog_proj文件夹变成了模块 -- settings.py:配置总文件 -- urls.py:url配置文件,django项目中的所有页面都需要对其配置url地址 -- wsgi.py:(web server gateway interface),服务器网关接口,python应用与web服务器直接通信的接口 templates:模板文件夹,存放html文件的(页面),支持使用Django模板语言(DTL),也可以使用第三方(jinja2) manage.py:项目管理器,与项目交互的命令行工具集的入口,查看支持的所有命令python3 manage.py
分析settings.py
import os
# 项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 项目安全码
SECRET_KEY = 'guwba1u$18=&*8kf44_u&swqb@xlwgel7n$0rs=(+f10yvz)p0'
# 调试模式,上线项目要关闭debug模式,不然后台出现异常会直接抛给前台展现给用户看了
DEBUG = True
# 在上线项目中,规定只能以什么ip地址来访问django项目
# DEBUG = FALSE
# ALLOWED_HOSTS = ['localhost']
ALLOWED_HOSTS = []
# 项目自带的应用
# 我们创建了自己的应用就要将自定义应用添加到该配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# 中间件
# django自带的工具集
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 配置url配件文件的根文件,执行urls.py
ROOT_URLCONF = '项目目录.urls'
# 模板,一个个html文件
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',
],
},
},
]
# 服务器网关接口应用
WSGI_APPLICATION = '项目目录.wsgi.application'
# 数据库配置
# 要配置自定义数据库去下面链接去查询详细配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 密码认证配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 国际化相关配置
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# 静态文件地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
```
创建项目应用
方法一 终端创建app
1、项目目录下创建应用:python3 manage.py startapp app
2、添加应用名到settings.py的INSTALLED_APPS中
INSTALLED_APPS = [ 'django.contrib.admin', ... 'django.contrib.staticfiles', # 添加的自定义应用 'app', ] ```
方法二 在pycharm创建项目时创建app,系统会帮我们自动添加到配置中
方法三 在manage命令行中创建app

应用目录
migrations:数据迁移(移植)模块,内容都是由Django自动生成 -- __init__.py __init__.py admin.py:应用的后台管理系统配置 apps.py:django 1.9后,本应用的相关配置 models.py:数据模型模块,使用ORM框架,类似于MVC模式下的Model层 tests.py:自动化测试模块,可以写自动化测试脚本 views.py:执行相应的逻辑代码模块(相应什么,如何相应),代码逻辑处理的主要地点,项目的大部分代码所在位置
第一个响应
app下的views.py文件
# 导入处理请求的 http相应功能
from django.http import HttpResponse
# django中每一个请求都有一个函数来处理
# 函数的参数约定request
def index(request):
# 简单相应一个字符串
return HttpResponse('index page!')
项目目录下的urls.py文件
from django.conf.urls import url from django.contrib import admin # 导入应用视图 import app.views as app_view urlpatterns = [ url(r'^admin/', admin.site.urls), # 为指定相应函数配置url url(r'^index/$', app_view.index), ]
第一个模板页面
项目下的templates文件夹用于存放模板页面,在该文件夹中新建index.html
from django.shortcuts import render def index(request): # 参数:请求对象request, 模板html文件, 传给前台的数据 return render(request, 'index.html')
模板路径配置(srttings.py)解读
TEMPLATES = [
{
# 如果使用第三方,可以在这个地方修改模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 模板页面默认路径:项目根路径下的templates文件夹
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
# 允许所有app均拥有自己的模板文件夹
'APP_DIRS': True,
...
},
]
```
第一个重定向
在app下的views.py文件配置响应函数
from django.shortcuts import render, redirect
# / 路径渲染index.html页面
def home(request):
return render(request, 'index.html')
# /index/ 路径重定向到 / 路径,达到渲染index.html页面
def index(request):
return redirect('/')
在项目目录下的urls.py文件配置 / 路径
from django.conf.urls import url from django.contrib import admin # 导入应用视图 import app.views as app_view urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/$', app_view.index), url(r'^$', app_view.home), ]
url应用移植
项目目录下的urls.py文件
# 导入include功能,将url配置转移到指定应用内部的自身url配置文件
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 将url配置操作交给app_test自身的urls.py来进行操作
# app-test/为app_test应用的总路径
url(r'^app-test/', include('app_test.urls')),
]
app_test下的urls.py文件
from django.conf.urls import url from . import views urlpatterns = [ # 1.不要直接留空,直接留空 http://localhost:8000/app-test/* 均可以访问 # 2.如果要配置index,访问的地址为 http://localhost:8000/app-test/index # 3.配置方式:r'^index/$',不要省略 / 符号 # 4.正则是否以$标识结尾取决于该路径是否会有下一级路径 url(r'^$', views.index), ]
多应用相同模板页面冲突
app和app_test两个应用均有模板页面index.html 1.在应用templates文件夹下建立与应用同名的文件夹,eg:app_text下就建立app_text 2.将模板创建在与应用同名的模板文件夹下 3.修改指定应用下views.py处理请求的render模板指向 def index(request): # 模板指向:blog_app应用的templates下的blog_app文件夹中的index.html return render(request, 'app_text/index.html') 注: 两种同时存在时, 项目下templates优先被访问
静态资源的配置
静态文件的根路由 => 规定了加载静态文件的起点
settings文件下的
STATIC_URL = '/static/' # 下方规定静态文件可以放入的文件夹 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'a'), os.path.join(BASE_DIR, 'b'), ]
直接导致模板页面导入静态文件起点:
<link src="/static/index.css"> #无需带上文件夹名字,Django会自动去找那个文件
查找方式
通过/static/匹配到静态文件的根路由 => 根路由管理着static | a | b 三个存放在项目根目录下的文件夹 => 三个文件夹中任意一个存放着index.css即可
url正则解读
原生字符串
urls.py配置路由
url(r'test', app_view.test)
views.py设置响应函数
def test(request):
return HttpResponse('test')
产生问题:请求地址包含test均可以访问
http://127.0.0.1:8000/test => /test | /atest | /testa | /atesta | /test/a | /test/
限制开头
urls.py配置路由
url(r'^test', app_view.test)
views.py设置响应函数
def test(request):
return HttpResponse('test')
问题:请求地址以test开头均可以访问
http://127.0.0.1:8000/test => /test | /testa | /test/a | /test/
再限制结尾
urls.py配置路由
url(r'^test$', app_view.test)
views.py设置响应函数
def test(request):
return HttpResponse('test')
问题:只能一种方式访问
http://127.0.0.1:8000/test => /test不能以 /test/ 访问 # http://127.0.0.1:8000/test/
优化结尾
urls.py配置路由
url(r'^test/$', app_view.test)
views.py设置响应函数
def test(request):
return HttpResponse('test')
# /test 和 /test/ 均可以访问
# http://127.0.0.1:8000/test
# http://127.0.0.1:8000/test/
问题:不能作为应用总路由
eg:app_test应用在项目urls.py
url(r'^app-test/', include('app_test.urls')) 末尾不能加$,因为作为应用总目录,是有下一级,如果用$标识结尾了,就代表不能有下一级路由
地址捕获
# urls.py配置路由
url(r'^test/(\d+)/\d+/(\d+)/$', app_view.test)
# 对应请求路径
# http://127.0.0.1:8000/test/1/22/333/
# 对应响应函数
def test(request, arg1, arg2):
# arg1: str 1
# arg2: str 333
return HttpResponse('test')
小结
常规路由配置 r'^index/$' r'^page/2/$' 应用路由配置 r'^app/' 根路由配置 r'^$' 路由配置均以 / 结尾 ()中的字段会被请求响应函数捕获 限制响应函数捕获的变量名 (?P<num>[0-9]+) 响应函数参数(requset, num)
DTL前后台数据通信
DTL概念
Django模板语言(Django Template Language)
响应函数传输数据给前端页面
views.py
from django.shortcuts import render
def index(request):
dic_data = {'key1': value1, 'key2': value2}
return render(request, 'index.html', dic_data)
<!-- index.html -->
<body>
{{ key1 }}
{{ key2 }}
</body>
前端页面传输数据给响应函数
<!-- index.html -->
<body>
<a href="{% url 'run_action' 1 %}">run 1</a>
<a href="{% url 'run_action' 2 %}">run 2</a>
</body>
views.py
from django.http import HttpResponse
def run(request, num):
if num == '1':
return HttpResponse('run 1')
if num == '2':
return HttpResponse('run 2')
return HttpResponse('404')
# urls.py
url(r'^run/(?P<num>[0-9]+)/$', run, name='run_action')
```
- 拓展
# 针对发生url转移的应用
# 项目urls.py
url(r'^app_test/', include('app_test.urls', namespace='app_test'))
# 应用urls.py
url(r'^index/$', index, name='index')
# 模板语法
<a href="{% url 'app_test:index' %}">test app index</a>
form表单提交数据
配置登录页面
urls.py配置路由 url(r'^login/$', login, name='login') # templates下新建login.html页面 # views.py设置响应函数 def login(request): pass
前端login.html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="/static/dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/css/login.css">
</head>
<body>
<div class="container">
<!-- hint:1 -->
<form action="{% url 'login' %}" method="post" class="col-md-6 col-md-offset-3">
<!-- hint:2 -->
{% csrf_token %}
<div class="form-group">
<label for="usr">用户名:</label>
<input class="form-control" type="text" id="usr" name="usr" placeholder="请输入用户名">
</div>
<div class="form-group">
<label for="pw">密码:</label>
<input class="form-control" type="password" id="pw" name="pw" placeholder="请输入密码">
</div>
<div class="form-group">
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox1" value="basketball"> 篮球
</label>
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox2" value="football"> 足球
</label>
<label class="checkbox-inline">
<input name="hobbies" type="checkbox" id="inlineCheckbox3" value="ping-pong"> 乒乓球
</label>
</div>
<button type="submit" class="btn btn-info col-md-12">登录</button>
</form>
</div>
</body>
</html>
<!-- hint:1 -->
<!-- action参数值:不填(向当前路径提交请求) | http://127.0.0.1:8000/login/ | /login/ | {% url 路由名 %} -->
<!-- hint:2 -->
<!-- 表单做提交需要做token的安全验证,也可以注释settings.py中间件:'django.middleware.csrf.CsrfViewMiddleware' -->
后台响应函数
def login(request):
if request.method == 'GET':
usr = request.GET.get('usr', 'USR')
print(usr)
ps = request.GET.get('ps', 'PS')
print(ps)
hobbies = request.GET.getlist('hobbies', 'HOBBIES')
print(hobbies)
elif request.method == 'POST':
print(request.POST)
usr = request.POST.get('usr', 'USR')
print(usr)
ps = request.POST.get('ps', 'PS')
print(ps)
hobbies = request.POST.getlist('hobbies', 'HOBBIES')
print(hobbies)
return render(request, 'login.html')
# request.GET和request.POST:均为django.http.request.QueryDict类型(非元素类型)
# .get('usr', 'USR'):第一次参数为前台提交字段的key,第二个参数为如果取不到值用默认值填充
Django框架 (一) 虚拟环境配置及简单使用的更多相关文章
- Django框架 之 logging配置
Django框架 之 logging配置 logging配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 ...
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- 【转】asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
- Windows10下Django虚拟环境配置和简单入门实例
环境win10家庭版64位 + python 3.5 + Django 1.8.2 1.创建virtualenv目录 开始/运行/cmd回车,进入cmd窗口,到自己指定的目录下创建virtualenv ...
- Django框架之虚拟环境搭建
创建虚拟环境篇 今天小编就来讲一下在Ubantu下如何搭建Django环境,希望能帮助那些不会搭建的童鞋^o^ 0.首先要先安装好Python环境,至于安装过程,小编就不讲了,百度一下,你懂得.. 1 ...
- 潭州课堂25班:Ph201805201 django框架 第五课 自定义简单标签,包含标签,模型类创建,梳理类创建 (课堂笔记)
自定义标签同自定义过渡器一样,要创建文件,在配置文件中以APP方法注册,对方法进注册,在 html 文件中引入,.. 由模板传参 在 在配置文件中改时区: 由视图函数传参 包含标签: 当有这种重复的代 ...
随机推荐
- /*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/
<?php/*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/$empList=[ ['ename'=>'张学友','se ...
- C#中生成的随机数为什么不随机?
from:https://www.xcode.me/more/net-csharp-generate-random 随机数生成方法可以说是任何编程语言必备的功能,它的重要性不言而言,在C#中我们通常使 ...
- JSP—连接池
1:为什么要使用连接池? 解决频繁连接释放造成的资源浪费 2:配置好的数据库连接池也是以数据源DateSource的形式存, 连接池的实现类负责建立与数据库的连接. 3:使用连接池关闭资源的区别? 使 ...
- Java多线程-----Thread常用方法
1.public Thread(Runnable target,String name) 创建一个有名称的线程对象 package com.thread.mothed; public class Th ...
- jQuery事件--blur()和focus()
blur([[data],fn]) 概述 当元素失去焦点时触发 blur 事件. 这个函数会调用执行绑定到blur事件的所有函数,包括浏览器的默认行为.可以通过返回false来防止触发浏览器的默 ...
- Lua语言特色
[1]多重赋值 多重赋值规则:若值的个数少于变量的个数,那么多余的变量会被赋值为nil 若值的个数多余变量的个数,那么多余的值会被“悄悄地”丢弃掉. 多重赋值应用示例: a, b = , * prin ...
- 20165305 苏振龙《Java程序设计》第八周课上测试补做
1. 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入world.sql,提交导入成功截图 2. ...
- linux常用命令:nl 命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- Step4:SQL Server 跨网段(跨机房)复制
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...
- JavaScript 中禁止用户右键菜单,复制,选取,Ctrl,Alt,Shift. 获取宽高,清除浮动
//禁用右键菜单 document.oncontextmenu = function(){ event.returnValue = false; } //禁用选取内容 document.onselec ...