文章目录
前言
框架(framework)的作用:省去重复代码的过程,使用框架可以快速开发特定的系统。
DRP:Don’t Repeat Yourself!
注意:理解所有注释内容
一、Python基本框架WSGI
1.1 WSGI(Web Server Gateway Interface)接口
from wsgiref.simple_server import make_server
# url指向的后端方法
def application(environ, start_response):
# 通过environ封装成一个所有请求信息的对象
# start_response可以很方便地设置响应头
start_response('200 OK', [('Content-Type', 'text/html')])
# 字典取请求信息:environ['path']==
path = environ['PATH_INFO']
if path == '/book1':
return [b'<p>content1</p>']
elif path == '/book2':
return [b'<p style="color:red;">content2</p>']
else:
return [b"<p style='color:red;'>404</p>"]
# 封装socket对象及准备过程(scoket, bind, listen)
httpd = make_server('', 8000, application) # url/port/function
# 开始监听http请求:
httpd.serve_forever()
1.2 升级功能
在上面的代码基础上分离完善框架各种功能,使框架功能分明,更方便使用和修改
from wsgiref.simple_server import make_server
import time
def func1(request):
"""单独写各个url对应的方法"""
return [b'<p style="color:red;">content1</p>']
def func2(request):
return [b'<p style="color:red;">content2</p>']
def current_time(request):
time_now = time.ctime(time.time())
with open('current_time.html', 'r') as f:
data = f.read()
data = data.replace('!time!', str(time_now)) // 模板语言,动态修改html
return [data.encode('utf8')]
def routers():
"""将所有url与对应的方法以元组返回"""
urlpatterns = ( // 所有url对应的函数
('/content1', func1),
('/content2', func2),
('/current_time', current_time),
)
return urlpatterns
def application(environ, start_response):
"""
environ:request, 从浏览器返回的信息,键值对,用字典方法取出
start_response: 返回给浏览器的相应信息
return:后端处理之后的html
"""
# 通过environ封装成一个所有请求信息的对象
# 字典取请求信息:environ['path']==
# start_response可以很方便地设置响应头
start_response('200 OK', [('Content-Type', 'text/html')])
path = environ['PATH_INFO']
urls = routers()
func = None
for item in urls: # 循环所有url路径,执行url需求的函数
if item[0] == path:
func = item[1]
break
if func:
return func(environ)
else:
return [b'<p style="color:red;">404</p>']
# 封装socket对象及准备过程(scoket, bind, listen)
httpd = make_server('', 8000, application)
# 开始监听http请求(固定用法):
httpd.serve_forever()
MVC模式
MTV模式
二、Django
2.1 创建方法
- 创建方法一
django-admin startproject mysite // 创建django项目
python manage.py startapp f1 // 在django项目中创建f1功能块
python manage.py runserver 127.0.0.1/8080 // 启动django项目,设置url/port,url不写时,默认为本地
python manage.py makemigrations // 创建数据库
python manage.py migrates // 更新数据库
- 创建方法二
直接在pycharm中创建django项目
2.2 文件介绍
2.2.1 django项目文件解析
- funcName:网站各个功能文件夹,可能有多个,都有相同的文件,用于写不同的功能
- migrations
- init.py:
- admin.py:
- apps.py:
- models.py:创建数据库
- tests.py:
- views.py:不同url指向的方法,在这里进行后端处理html,并将处理之后的html返回给前端
- migrations
- mysite
- settings:配置文件(路径等)
- urls:路径映射,就是网站各个路径指向的函数的元组
- wsgi:python的基本网站框架,完成各种底层功能
- manage.py:功能接口,用于创建项目、数据库等操作
- templates:所有的html放在这个文件夹
2.2.2 URL
url参数
# FILE:/urls.py
from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^info/', views.info, para, alias),
]
path(r'^info/', views.info, para, alias),
参数一:正则表达式,匹配相应的url,可能同一类的url都交给一个函数处理
参数二:url所映射到的处理函数
参数三:传给函数的参数(选用)
- 无名参数 no-name
多个括号中的匹配内容按顺序传给函数,函数中参数名可自定义
# FILE:/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^info/([\d]{4})/([\d]{2})', views.info),
]
# 正则中,括号中的值会作为para传给映射函数view.info(),多个括号,函数中就需要接收多个参数
# para始终为字符串类型
# FILE:/views.py
# 在映射函数中直接使用
def info(req, para1, para2):
return HttpResponse(para)
- 有名参数Named Group
命名分组后,传入的参数必须按照组名传入,但是可以不管顺序,
# FILE:/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^info/(?P<year>[\d]{4})/(?P<month>[\d]{2})', views.info),
]
# FILE:/views.py
def info(req, month, year):
return HttpResponse(year + month)
- 默认参数
# FILE:/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^info/', views.info, {
'name': 'wolf'}),
]
# FILE:/views.py
def info(req, name):
return HttpResponse(name)
# 这里的参数name必须和默认参数中的key相同
如果同时有默认参数和有名参数,且命名一样,默认参数会覆盖掉有名参数
参数四:url别名(选用)
# FILE:/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^info/', views.info, {
'name': 'wolf'}, name='user_info'),
]
# url别名,即127.0.0.1:8000/info == 127.0.0.1:8000/user_info
用法:
<form action={% url "wolf" %} method='post'> <!--可以用/user_info代替原/url,后端在修改url代码时,前端可以一直用/user_info这个url登录,-->
</form>
路由分发
# FILE:/mysite/urls.py
"""
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path(r'blog/', include('blog.urls')),
# 将blog APP下的所有链接,分发到blog文件夹下的urls文件,以后由/blog/链接进来的都到blog/urls.py处理,映射函数就写到blog/urls.py中
# /mysite/urls.py只用于路由分发,映射函数写到app/urls.py中
]
# FILE:blog/urls.py
from django.urls import path
from blog import views
urlpatterns = [
path(r