前言:
Flask虽然是轻量级框架但是复杂操作需要自己写扩展和灵活性还是非常高的
基于Flask的项目 我就写在一个博客里了 持续更新。。。
Django众所周知的Pythonweb框架
之前写过一篇Django的博客 是1.11.8版本的 后来决定先写Flask
所以就没有持续更新 Django1.11.8版本
今天我们说的是Django2.xx版本 2.xx版本还是有所不同的
大概19年初中期就会出2.xx的长期支持版
Django
-
用于创建模型的 对象关系映射
-
为最终用户设计的完美管理界面
-
一流的 URL 设计
-
设计者友好的模板语言
-
缓存系统
框架模式:
MTV
M: Models 数据库模型
T:Templates 模型
V: views 视图
Django框架的安装:
查看已经安装的版本
进入Python的交互模式
import django 如果没有报错说明已经安装Django
django.VERSION 查看Django版本
>>> import django
>>> django.VERSION
(2, 1, 2, 'final', 0)
>>>
安装Django
在线:
sudo pip3 install django[==版本号] 默认最新版
sudo pip3 install django
离线:
下载安装包tar -zxvf Django-1.11.8.tar.gz
cd Django-1.11.8
sudo python3 setup.py install
创建django项目
手动创建
MacBook-Pro:Downloads paris$ mkdir django
MacBook-Pro:Downloads paris$ cd django/
MacBook-Pro:django paris$ django-admin startproject mydjango
MacBook-Pro:django paris$ cd mydjango
MacBook-Pro:mydjango paris$ ./manage.py runserver
Django项目结构介绍:
manage.py
包含执行Django的各项操作的指令(子命令)
如包含启动服务 runserver
创建项目 Django-admin
创建管理员 createsuperuser
。。。
启动服务后就可以访问了
我还是用pycharm创建 方便一点
File ->New Project ->Django
默认的项目结构
db.sqlite3 是数据库的的文件 运行一次就会自动创建 删除了 下次允许还会有 所以先无视
views不是自带的 需要手动创建
主目录(与项目名称一致)
__init__.py
项目的初始化文件 服务被启动 该文件自动运行
urls.py
项目的URL配置文件 基础路由配置
wsgi.py
Web Server Gateway Interface
web服务网管关借口
setting.py
1.BASE_DIR 获取当前项目的绝对路径
2.DEBUG False关闭 True开启调试模式
3.ALLOWED_HOSTS:
是否允许在局域网内被其他机器访问
如果允许就在此列表内添加
推荐写["*"] 代表当前局域网内的所有机器都可以访问项目
如果允许被其他机器访问必须使用一下方式启动项目
./manage.py runserver 本机ip:端口号(默认8000)
4.INSTALLED_APPS
指定已经安装的应用 如果有自定义应用的话 需要在此注册
5.MIDDLEWARE:
中间件 如果有自定义的中间件 需要在此注册 过滤拦截请求响应
6.ROOT_URLCONF
用于指定项目路由的基础路由的配置文件
7.TEMPLATES
指定模板的信息
8.DATABASES
指定数据库的信息
9.LANGUAGE:
语言设置 如果允许为中文 允许将值设置为"zh-Hans"
10.TIME_ZONE
指定时区 中国区 允许设置为"Asia/Shanghai"
11.STATIC_URL
用于配置静态文件路径
这里可以看到配置路由的函数是path 而不想之前的版本是url
这里url也是可以用的 不过官方给的默认配置都给成了path
path的使用:
from django.urls import path, re_path
默认在主目录中 主路由配置文件 会包含基本的地址映射
通过url中定义好的地址找到对应的视图函数
path语法:
path(route, view, kwargs=None, name=None)
route:
路由地址 不支持正则
view:
视图处理函数的名称
kwargs:
键值对给view传参用的
name:
为URL起别名 在地址反向解析时用得
re_path语法:
re_path(route, view, kwargs=None, name=None)
route:
路由地址 支持正则表达式
view:
视图处理函数的名称
kwargs:
键值对给view传参用的
name:
为URL起别名 在地址反向解析时用得
通过re_path向视图传参:
使用正则表达式传参
使用子组传参 一个子组就是一个参数
要传递多个参数的话需要使用多个子组 中间用/隔开
使用kwargs传参:
dic = {
"name":Paris,
"age":18
}
re_path(r"^show/$", show3_views, dic)
def show3_views(request, name, age):
return HttpResponse
以下是主目录的urls.py
主目录就是和项目同名的文件夹
"""Demo1 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
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, re_path
from django.conf.urls import url
from .views import *
urlpatterns = [
# 后台管理系统
path('admin/', admin.site.urls),
# 正则表达式配置url路由
re_path(r"^show/$", show_views),
# 路由的匹配规则与flask不一样
# 如果使用正则的方式匹配路由
# 如以及sh开头 的匹配规则 有一个满足url以后的都不会再匹配
# re_path(r"^sh", sh_views),
# 下面的show就永远都不会被匹配到
# path("show/", show_views),
# 使用结尾限制就不会出现匹配不到的情况
# 或者说直接用path不使用正则也可以
# re_path(r"^sh$", sh_views),
# 使用子组传参
# 匹配show url后有两位参数的地址
re_path(r"^show/(\d{2,5})/$", show1_views),
# 匹配生日
re_path("show/(\d{4})/(\d{2})/(\d{2})", birthday_views),
# 在1.11版本里字典传参 如果age是int类型的 到视图函数里还是int类型
# 但此处到视图后会变成字符串 字符传参的特性不变 形参实参必须相同
re_path(r"show3/$", show3_views, {"name": "Paris", "age": 18}),
url(r"^url/$", show4_views)
]
手动在主目录里创建一个views.py 文件 用来配置处理所有的路由的视图函数
并在urls导入
from django.http import HttpResponse
def show_views(request):
return HttpResponse("我的第一个Django程序")
def sh_views(request):
return HttpResponse("这是SH视图函数")
def show1_views(request, num1):
return HttpResponse("这是处理两位数的视图函数 子组参数:%s" % num1)
def birthday_views(request, year, month, day):
return HttpResponse("您的生日为: %s年 %s月 %s日" % (year, month, day))
def show3_views(request, name, age):
return HttpResponse("姓名:%s 年龄:%s" % (name, age))
def show4_views(request):
return HttpResponse("这是使用url函数配置路由")
这里可以看到配置路由的函数是path 而不像之前的版本是url
这里url也是可以用的 不过官方给的默认配置都给成了path
Django的应用:
什么是应用?
应用就是网站中一个独立的程序模块
在Django中 主目录不处理用户请求
主目录主要是做项目的初始化以及请求分发(分布式请求处理)
而具体的请求 由具体的应用去处理
创建应用
指令
./manage.py startapp 应用名称
在settings中进行注册
在INSTALLED_APPS中追加引用名称
应用的结构组成:
migration目录
存放数据库的中间文件
__init__.py
做应用的初始化文件
admin.py
应用的后台管理配置文件
app.py
应用的属性配置文件
models.py
与模型相关的映射文件
tests.py
当前应用的测试文件
views.py
定义视图处理函数的文件
分布式路由系统d
在每个应用中创建一个urls.py 内容可以参考主目录的urls.py
当访问路径是http://192.168.200.133:8000/music/xxx
则交给music的urls去处理
当访问路径是http://192.168.200.133:8000/news/xxx
则交给news的urls去处理
当访问路径是http://192.168.200.133:8000/news/index
则交给news的urls找到index_views去处理
创建4 个APP 每个app的结构都是一样的
分布式路由
"""Netease URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
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, re_path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 当访问路径是http://192.168.200.133:8000/music/xxx
# 则交给music的urls去处理
re_path(r"^music/", include("music.urls")),
# 当访问路径是http://192.168.200.133:8000/news/xxx
# 则交给news的urls去处理
re_path(r"^news/", include("news.urls")),
re_path(r"", include("index.urls")),
]
from django.urls import path, re_path
# from django.conf.urls import url
from .views import *
# 主要实现news应用中的地址与视图函数的处理
# 当访问路径是http://192.168.200.133:8000/news/index
# 则交给news的urls找到index_views去处理
# 该文件中 只需处理news/后面的路由
urlpatterns = [
# 当访问路径是index的时候交给index_views视图函数去处理
re_path(r"^$", index_views),
# url(r"^login/$", index_views)
]
news.views
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def index_views(request):
return HttpResponse("这是news的index首页")
index.url
from django.conf.urls import url
from django.urls import re_path
from .views import *
urlpatterns = [
re_path(r"^$", index_views),
re_path(r"^login/$", login_views),
re_path(r"^register/$", register_views),
url(r"^register/$", register_views)
]
index.views
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def index_views(request):
return HttpResponse("这是首页")
def login_views(request):
return HttpResponse("这是登录页面")
def register_views(request):
return HttpResponse("这是注册页面")
小技巧
每次启动时都需要参数并且pycharm不不会默认传递参数
这里我在这里重写了一下获取到的shell参数
这样测试的时候就可以直接在pycharm运行了
创建APP 或者需要其他子命令时 可以重写 或注释后再终端 运行
#!/usr/bin/env python3
import os
import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Netease.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
########################### 重写终端参数 #######################
sys.argv = ['./manage.py', 'runserver', '192.168.200.133:8000']
##############################################################
execute_from_command_line(sys.argv)