Django框架
- django 简单的开发框架,是简单的三层逻辑架构,MVT
Django基本过程
- 用户在浏览器中输入地址
- URL路由器(路由器根据提交的URL地址调取相应的函数
- 函数会通过model与数据库进行交互(从数据库中获取想要的信息)
- 浏览器会根据HTML中的代码进行将相应的信息添加的到指定的位置
图例解析
- 比如用户输入网址,通过网址路由到 项目URL路由,URL又将地址路由到组成项目APP中(此处的APP是对项目主题进行分解,不是手机中的APP),APP又通过路由路由找到相应的函数,函数会返回用户请求的界面,如果里面有需要查询的数据,就后通过model查询 DB数据,返回。然后浏览器就自动对其解析,返回的HTML中 位置是有名字的,比如 用户姓名,返回的数据中也有用户姓名,浏览器就会把数据匹配到HTML界面中
项目初始化
- 在建立项目之初需要对项目进行项目分析,就是项目整体分成几个APP,我做的第一个网站 主要分成了 四个部分 用户信息、操作信息、机构信息、课程信息,每一部分对应一个APP,主要是依据数据来分的
django-admin startproject first_project # 项目建立,建立后可以看下里面都有什么呀
python manage.py startapp [APP名称] # 建立项目后,cd 到项目中,否则找不到manage.py 然后再执行命令
# 命令行运行项目 端口可自行设置
python manage.py runserver 8000
# 查看 mange.py 中的命令
python manage.py
# 从别的地方抄来了一段代码,可以简单的看下
#下面的部分是写在view里面的
from django.http import HttpResponse
from book.views import book
from move.views import move
def index(request):
return HttpResponse("首页")
def book(request):
return HttpResponse("图书首页")
def movie(request):
return HttpResponse("电影首页")
# 下面的部分是写在主URL里面
urlpatterns = [
path('admin/', admin.site.urls),
path('',index),
path("book/",book), # URL中book 对应上面的book函数 所以返回的是图书首页
path("movie/<movie_id>",movie) # URL中book 对应上面的movie函数 所以返回的是电影首页,<movie_id> 为url中传输的参数
]
#views.py中获取参数 两种方法
def movie(request):
movie_id = request.GET.get("id")
text = movie_id
return HttpResponse(text)
def movie(request,movie_id):
text = movie_id
return HttpResponse(text)
setting设置
# debug 模式
DEBUG = True
# 允许访问地址(白名单)
ALLOWED_HOSTS = ['127.0.0.1']
# APP注册
INSTALLED_APPS = [
'APP_one',
'APP_two',
]
Django路由
# APP中设置url
from django.urls import path ,include
urlpatterns = [
path('book/',include("book.urls"))
]
Django 传递参数
urlpatterns = [
path('news/<news_id>', views.news_detail),
path('news/news_detail/', views.news_detailone),
]
def news_detail(request,news_id):
return HttpResponse("新闻详情页-{}".format(news_id))
def news_detailone(request):
news_id = request.GET.get("news_id")
return HttpResponse("新闻最新页-{}".format(news_id))
URL模块化
- 各个APP模块中自建路由映射
- 主路由中通过include进行映射APP中得路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]
url命名与反转
# 应用命名空间 app_name = 'front'
app_name = 'front'
urlpatterns = [
path('sigin/',views.login,name='login'),
]
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
def index(request):
username = request.GET.get("username")
if username:
return HttpResponse("后台首页")
else:
# reverse('login') -> /front/singin/
# url 反转
reverse_url = reverse('front:login')
return redirect(reverse_url)
def login(request):
return HttpResponse("后台登陆界面")
url反转传参
# 传参方式
reverse("front:login",kwargs={"uid":1})
def index(request):
username = request.GET.get("username")
if username:
return HttpResponse("后台首页")
else:
# 设置默认传入参数
reverse_url = reverse("front:login",kwargs={"uid":1})
return redirect(reverse_url)
def login(request,uid):
return HttpResponse("后台登陆界面{}".format(book_id))
指定默认参数
# article/views.py
article_lists = ["a","b","c"]
def article(request):
return HttpResponse(article_list[0])
def page(request,page_id=0)
return HttpResponse(article_lists[page_id])
# article/urls.py
from django.urls import re_path,path
from . import views
urlpatterns = [
path("",views.article),
path("page/",views.apge)
path("page/<int:page_id>",views.page),
]
re_path函数
- 和path一样,通过正则表达式实现一些复杂的映射需求。
article/urls.py
------------------------------------------------------------------
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r"^$",views.article),
re_path(r"^article_list/(?P<year>\d{4})/",views.article_list)
re_path(r"^article_list/(?P<mouth>\d{2})/",views.article_mouth)
]