本課主題

  • MVC 介绍
  • Django 介紹

MVC 介绍

controllers 处理用户请求

views 放置HTML模版

models 操作数据库

MVC框架就是目录的归类

MVC 是一种软件开发的方法,它把代码的定义和数据访问的方法(模型)与请求逻辑 (控制器)还有用户接口(视图)分开来

Django 介紹

Django开发的一般流程包括模型设计、URL设计、视图编码、模板设计,搭建Django应用的一种典型流程是:先设计好模型,然后就尽快把admin 运行起来,以便你的员工、客户可以尽快开始填充数据。之后,你再考虑该如何把数据呈现给用户

创建 Django

  1. 创建 project

    django-admin startproject mysite
    • 创建一个叫 mysite 的 project,会自动生成以下几个 py 文件:
    • setting.py #配置文件, 例如增加缓存功能,加密加盐
    • urls.py #路由系统,URL 保存了一个函数和网页的对应关系
    • wsgi.py #WSGI,封装了socket 对象和功能,它是一套规则、接口
    • manage.py #负责管理 Django 程序,比如创建 APP,运行 Django 程序和在数据库中创建表
  2. 创建虚拟环境,用来安装 django 
    virtualenv -p python3 venv
  3. 创建 App
    创建一个程序叫 app01,在这个文件夹下面有 migrations 文件夹和以下的 py 文件
    cd mysite
    python3 manage.py startapp app01

    生成的文件

    migrations/		# 数据修改表结构
    admin.py # Django 为我们提供的后台管理
    apps.py # 配置当前 App
    models.py # ORM,写指定的类 通过命令创建数据库结构表
    tests.py # 单元测试
    views.py # 业务代码
  4. 运成 Django 程序
    python3 manage.py runserver 127.0.0.1:8000
  5. 注册 App
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01', # 注册 APP
    ]
  6. 在 sqlite 中创建表
    python3 manage.py makemigrations
    python3 manage.py migrate
  7. xxxx

URL设计

在 URL 中写入相对的路径,下面例子加了一个 h.html 的 url 路径,你只须要访问时 http://127.0.0.1:8000/h.html/ 就可以看到 home 函数返回的 <h1>Welcome to GRILLFISH!</h1>, django 必须返回 HttpResponse 对象,在 URL 路由中有 Function Based View (FBV) 和 Class Based View (CBV) 之分,你可以在路由中输入视图函数 views.login 或者是类视图函数 views.Home.as_view( )

from django.shortcuts import HttpResponse

def home(request):
return HttpResponse('<h1>Welcome to GRILLFISH!</h1>') urlpatterns = [
path('admin/', admin.site.urls),
path('h.html/', home), #url 路径和函数对应关系
]

URL 路由中正規表达式的用法

用户可以在 urls 中以正規表达式来设计路由規则,好的路由设计是一个好网站的基本条件

from django.urls import path, re_path
from app01 import views
urlpatterns = [
path(r'index/', views.index),
re_path(r'fakedindex/(?P<year>\d+)/', views.index, name="index"),
re_path(r'details/(\d+)/', views.details), # 导入 re_path 来使用正規表达式
]

定义好路由規则,然后定义 views.py

# views.py
def index(request):
USER_DICT = {
1: {'username':'root1','email':'root1@live.com'},
2: {'username':'root2','email':'root2@live.com'},
3: {'username':'root3','email':'root3@live.com'},
4: {'username':'root4','email':'root4@live.com'},
5: {'username':'root5','email':'root5@live.com'},
}
return render(request, 'index.html',{'user_list': USER_DICT})

和 html 的 render 方法

<p>
{% for k, v in user_list.items %}
<li><a target="_blank" href="/details/{{k}}/"> {{v.username}} </a></li>
{% endfor %}
</p>

不同正規表达式的路由定义对应的函数方法也有些不同,可以用以下几个方法生成 url,具体方法如下:

url(r'^details-(\d+)-(\d+).html', views.details)
# views.py
def func(request, nid, uid):
pass
def func(request, *args):
args = (2,9)
def func(request, *args, **kwargs):
args = (2,9) url(r'^details-(?P<nid>\d+)-(?P<uid>\d+).html', views.details)
# views.py
def func(request, nid, uid):
pass
def func(request, **kwargs):
kwargs = {'nid': 2, 'uid': 9}
def func(request, *args, **kwargs):
args = (2,9)

正規表达式和函数的定义

URL 路由分发

在 Django 中可以通过加入 include 来分发不同 app 中的 urls,然后进行处理,假如新增一个 app02 的子程序,然後在主程序的 urls.py 中加入以下路由关系,这样程序也照样可以正常连行

from django.conf.urls import url, include
urlpatterns = [
url(r'cmdb/', include('app01.urls')),
url(r'monitor/', include('app02.urls')),
]

创建额外的文件夹

创建 templates 文件夹来存放 HTML 文件,创建 static 文件夹来存放 CSS 文件和 JAVASCRIPT 文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/common.css" /> <!-- 从 /static/ 文件夹中找 common.css -->
</head>
<body>
<form action="/login/" method="POST"> <!-- 以POST的方式提交数据到 /login/ URL -->
<p> <label for='username'>用戶名,</label>
<input id='username' type='text' />
</p>
<p> <label for='passwd'>密碼,</label>
<input id='passwd' type='password' />
<input type='submit' value='提交'/>
</p>
</form>
<script src="/static/jquery-1.12.4.js"></script> <!-- 从 /static/ 文件夹中找 jquery -->
</body>
</html>

templates 和 static 文件

然后要在 setting.py 中定义 templates 和 staticfile directory, 这样就可以有在 views.py 中简单调用 render 函数来实现业务逻辑。

def login(request):
# f = open('templates/login.html','r',encoding='utf-8')
# data = f.read()
# f.close()
# return HttpResponse(data)
return render(request, 'login.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',
],
},
},
]

templates 文件夹定义

STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)

static 文件夹定义

以 GET 的方式提交请求通常是用来获取数据,內容会在 URL中;以 POST 的方式提交请求時,内容会包含在 RequestBody 中;下面介紹的是 render 模板和 redirect 的作用。redirect 只接受 url 路径, 比如 www.baidu.com 或者是本地 url,/login/

from django.shortcuts import render
from django.shortcuts import redirect # Create your views here.
def login(request):
if request.method == 'POST':
user = request.POST.get('user',None)
pwd = request.POST.get('pwd',None)
if user == 'root' and pwd == '':
return redirect('http://google.com') return render(request, 'login.html')

render 和 redirect

文件上传的处理需要

file_obj = request.FILES.get('f1',None)

import os
file_path = os.path.join('uploads', file_obj.name)
with open(file_path, mode='wb') as f:
for i in file_obj.chunks():
f.write(i)

可以在 views.py 中创建类来封装 get 和 post 方法,

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, 'POST')
return render(request, 'home.html')

在 url.py 中加入以下语句就可以调用上述的类

path(r'home/', views.Home.as_view()),

  

class View:
"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
""" http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] def __init__(self, **kwargs):
"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
for key, value in kwargs.items():
setattr(self, key, value) @classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs # take name and docstring from class
update_wrapper(view, cls, updated=()) # and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) def http_method_not_allowed(self, request, *args, **kwargs):
logger.warning(
'Method Not Allowed (%s): %s', request.method, request.path,
extra={'status_code': 405, 'request': request}
)
return HttpResponseNotAllowed(self._allowed_methods()) def options(self, request, *args, **kwargs):
"""Handle responding to requests for the OPTIONS HTTP verb."""
response = HttpResponse()
response['Allow'] = ', '.join(self._allowed_methods())
response['Content-Length'] = ''
return response def _allowed_methods(self):
return [m.upper() for m in self.http_method_names if hasattr(self, m)]

class View 源码

 

路由系统介绍

Djgano 的生命周期是这样的:当有新的客户端请求来的时候,会向 urls.py 查找对应的函数,路由系统进行路由匹配,然后再跟据路由系统中找到视图函数 views.py,函数会从数据库获取数据,然后再以结合 HTML 实现数据。

  1. 普通关系
  2. 动态关系
  3. 路由关系

模型设计

request.method
request.POST.get('nid', None)
request.GET.get('nid', None) #lcoalhost/home?nid=123
HttpResponse("Hello World!")
render(request, 'login.html', {'error_msg': error_msg})
redirect('http://google.com')

request 方法

复习题

  1. 如何创建一个 django 工程?
  2. 创建 django 工程后会有那些自动生成的文件夹,每个文件夹的功能是什么?
  3. Django 的生命週期是什么?
  4. 什么是 FBV 和 CBV ?

作业

  1. 登录
  2. 主机管理页面,查看所有主机的信息
  3. 增加主机信息
  4. 查看详细

參考資料

银角大王:Python之路【第十六篇】:Django【基础篇】

金角大王:

其他:

第十七章:Python の Web开发基础(四) MVC与Django的更多相关文章

  1. python web开发 框架 模板 MVC

    我是跟着廖雪峰老师学习的,对于我这样的纯小白来说,跟着他的网站学习,简直是被妈妈抱在怀里一样无忧无虑,这样的学习本来没有记录下来的必要,但是由于我的粗心大意,经常会出现一些错误,所以我决定把这些错误记 ...

  2. 第十四章:Python の Web开发基础(一) HTML与CSS

    本課主題 HTML 介绍 CSS 介绍 HTML 介绍 HTML 的头部份,重点: 定义HTML 的编码:<meta charset="UTF-8"/> 定义标题: & ...

  3. 第十五章:Python の Web开发基础 (二) JavaScript与DOM

    本課主題 JavaScript 介绍 DOM 介绍 JavaScript 介绍 JavaScript 是一门编程语言,它可以让网页动起来的,JavaScript 的变量有两种,一个是局部变量:一个是全 ...

  4. 第十六章:Python の Web开发基础(三) jQuery与Ajax

    本課主題 jQuery 介绍 Ajax 介绍 jQuery 介绍 选择器 jQuery 的选择器分不同的种类,主要目的是用来查找目标的 HTML 标签,方便对目标标签进行操作,比如找到 <li& ...

  5. SharePoint 2010 最佳实践学习总结------第1章 SharePoint Foundation开发基础

    ----前言 这段时间项目出在验收阶段,不是很忙,就潜心把SharePoint学一下,不求有多深刻,初衷只是先入门再说.后续会发布一系列的学习总结.主要学习的书籍为<SharePoint2010 ...

  6. 2020 python web开发就业要求锦集

    郑州 Python程序员 河南三融云合信息技术有限公司 6-8k·12薪 7个工作日内反馈 郑州 1个月前 本科及以上2年以上语言不限年龄不限 微信扫码分享 收藏 Python程序员 河南三融云合信息 ...

  7. 《Python Web开发学习实录》高清PDF版|百度网盘免费下载|Python Web开发学习实录

    <Python Web开发学习实录>高清PDF版|百度网盘免费下载|Python Web开发学习实录 提取码:9w3o 内容简介 Python是目前流行的动态脚本语言之一. 李勇,本书共1 ...

  8. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  9. 【SharePoint学习笔记】第1章 SharePoint Foundation开发基础

    SharePoint Foundation开发基础 第1章 SharePoint Foundation开发基础 SharePoint能做什么 企业信息门户 应用程序工具集(文档库.工作空间.工作流.维 ...

随机推荐

  1. ettercap的中间人欺骗

    环境准备:kali系统 因为kali系统自带ettercap,比较方便, 不需要安装 ifcofing命令查看当前网关 ,当前的IP是: 172.16.42.1 查找局域网所有主机 通过netdisc ...

  2. C#复习资料

    C#期末考试复习题 一.单项选择题(每小题2分,共20分) 1.在类作用域中能够通过直接使用该类的(   )成员名进行访问. A. 私有      B. 公用      C. 保护      D. 任 ...

  3. configure:cannot guess build type; you must specify one

    换了msys2后.编译xerces-c-2.8.0../runConfigure -pmingw-msys -cgcc -xg++ -s -P/opt/xercesc-2.8.0 后遇到如标题所看到的 ...

  4. POJ 1251 Jungle Roads(最小生成树)

    题意  有n个村子  输入n  然后n-1行先输入村子的序号和与该村子相连的村子数t  后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离  求链接全部村子的最短路径 还是裸的最小生成树咯 ...

  5. Highcharts使用CSV格式数据绘制图表

    Highcharts使用CSV格式数据绘制图表 CSV(Comma-Separated Values,逗号分隔值文本格式)是採用逗号切割的纯文本数据.通常情况下.每一个数据之间使用逗号切割,几个相关数 ...

  6. Java并发与同步

    Java中并发的形式无非是多线程和多进程两种形式.这两种形式都是能够利用多核来发挥计算能力的. 先说并发: 多进程意味着同一时候执行多个JVM.这个代价通常比多线程高,每一个JVM都有自己的堆栈.都要 ...

  7. Git(二)Git几个区的关系与Git和GitHub的关联

    前言 前面只是大概的介绍了一点基础的东西,接下来会更加深入的去了解一下Git. 一.Git的工作区.暂存区和版本库之间的区别和联系 1)工作区 在PC中能看得到的创建的一个管理仓库的目录.比如目录下G ...

  8. linux下使用自带mail发送邮件(超简单)

    linux 发邮件最简单的办法 ,也可以使用公司邮箱,需要安装mailx工具,mailx是一个小型的邮件发送程序. 具体步骤如下: 1.安装 [root@001 ~]# yum install mai ...

  9. python scipy计算机数值库

    scripy有聚类的python 代码,如: http://blog.csdn.net/elaine_bao/article/details/50242867

  10. Xcode极速代码,征服Xcode

    当谈论到iOS开发工具时,有一个肯定是所有iOS开发者都熟悉的,那就是Xcode.Xcode是使所有令人赞叹的iOS app成为可能的驱动力. Xcode能帮助我们完成非常多的事情,但是这也有点让人头 ...