03 demo版 05年正式版
自定义了一套用户管理系统 开发起来非常的快
python+django月活7亿
官网
2.0中文文档
中文文档
pythondjango最大支持3.51.82.7 3.4 3.51.93.4 3.5 3.62.03.5 3.6 3.72.1web服务器
负责处理http的请求 响应静态文件 常见的 Apache nginx iis
应用服务器
负责处理逻辑的服务器 因为 python jaee php 这些代码是不可能通过nginx apache 只能通过应用服务器来处理 常见的应用服务器有 uwsgi tomcat
web应用框架
封装了常用的web功能 flask、tornado、django 、 java
的 ssh(structs2+spring3+hibernate3)
详见图
注意 url中所有的编码都是 ASCII 如果出现中文 浏览器会先进行编码 然后进行传输
win永久安装pip的源
首先在window的文件夹窗口输入 :%APPDATA%
然后在底下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini,然后再里面输入内容:
[global] timeout = 6000 index-url = http://pypi.douban.com/simple trusted-host = pypi.douban.com截图:
京东 python2 flask2.0 淘宝 python3 flask1.0
到目前位置,我们所有的第三方包安装都是直接通过pip install xx的方式进行安装的,这样安装会将那个包安装到你的系统级的Python环境中。但是这样有一个问题,就是如果你现在用Django 1.10.x写了个网站,然后你的领导跟你说,之前有一个旧项目是用Django 0.9开发的,让你来维护,但是Django 1.10不再兼容Django 0.9的一些语法了。这时候就会碰到一个问题,我如何在我的电脑中同时拥有Django 1.10和Django 0.9两套环境呢?这时候我们就可以通过虚拟环境来解决这个问题。
虚拟环境相当于一个抽屉,在这个抽屉中安装的任何软件包都不会影响到其他抽屉。并且在项目中,我可以指定这个项目的虚拟环境来配合我的项目。比如我们现在有一个项目是基于Django 1.10.x版本,又有一个项目是基于Django 0.9.x的版本,那么这时候就可以创建两个虚拟环境,在这两个虚拟环境中分别安装Django 1.10.x和Django 0.9.x来适配我们的项目。
virtualenv是用来创建虚拟环境的软件工具,我们可以通过pip或者pip3来安装:
pip install virtualenv pip3 install virtualenv创建虚拟环境非常简单,通过以下命令就可以创建了:
virtualenv [虚拟环境的名字]如果你当前的Python3/Scripts的查找路径在Python2/Scripts的前面,那么将会使用python3作为这个虚拟环境的解释器。如果python2/Scripts在python3/Scripts前面,那么将会使用Python2来作为这个虚拟环境的解释器。
虚拟环境创建好了以后,那么可以进入到这个虚拟环境中,然后安装一些第三方包,进入虚拟环境在不同的操作系统中有不同的方式,一般分为两种,第一种是Windows,第二种是*nix:
windows进入虚拟环境:进入到虚拟环境的Scripts文件夹中,然后执行activate。*nix进入虚拟环境:source /path/to/virtualenv/bin/activate 一旦你进入到了这个虚拟环境中,你安装包,卸载包都是在这个虚拟环境中,不会影响到外面的环境。退出虚拟环境很简单,通过一个命令就可以完成:deactivate。
在电脑的环境变量中,一般是不会去更改一些环境变量的顺序的。也就是说比如你的Python2/Scripts在Python3/Scripts的前面,那么你不会经常去更改他们的位置。但是这时候我确实是想在创建虚拟环境的时候用Python3这个版本,这时候可以通过-p参数来指定具体的Python解释器:
virtualenv -p C:\Python36\python.exe [virutalenv name]virtualenv 需要进入目录 激活或者退出 这样很麻烦
virtualenvwrapper这个软件包可以让我们管理虚拟环境变得更加简单。不用再跑到某个目录下通过virtualenv来创建虚拟环境,并且激活的时候也要跑到具体的目录下去激活。
创建虚拟环境:
mkvirtualenv my_env那么会在你当前用户下创建一个Env的文件夹,然后将这个虚拟环境安装到这个目录下。 如果你电脑中安装了python2和python3,并且两个版本中都安装了virtualenvwrapper,那么将会使用环境变量中第一个出现的Python版本来作为这个虚拟环境的Python解释器。
切换到某个虚拟环境:
workon my_env退出当前虚拟环境:
deactivate删除某个虚拟环境:
rmvirtualenv my_env列出所有虚拟环境:
lsvirtualenv进入到虚拟环境所在的目录:
首先切换到该虚拟环境 cdvirtualenv在我的电脑->右键->属性->高级系统设置->环境变量->系统变量中添加一个参数WORKON_HOME,将这个参数的值设置为你需要的路径。
在使用mkvirtualenv的时候,可以指定--python的参数来指定具体的python路径:
mkvirtualenv --python==C:\Python36\python.exe qf_envpip install django==2.0
pip install pymysql
1.命令行
豆瓣 拥有 图书 电影 音乐 同城 这些模块 站在django 的角度来看 电影 图书 音乐 就是豆瓣的app
django 项目 会有许多app组成 一个app 可以被用到其它的项目
django 回到 主的urls.py中 寻找对应的视图 有一个urlpatterns变量 来这个变量中读取匹配规则 需要path()函数包裹 返回一个对象
from django.contrib import admin from django.urls import path from django.http import HttpResponse from book.views import book from movie.views import movie def index(request): return HttpResponse("豆瓣首页") urlpatterns = [ path('admin/', admin.site.urls), path('',index), #后面不要加括号 path('book/',book), #后面不要加括号 path('movie/',movie), #后面不要加括号 ]第一个参数永远是request对象 这个对象存储了 请求过来的所有信息 比如参数 和 请求头 返回结果必须是HttpResponse
from django.http import HttpResponse # Create your views here. def book(request): return HttpResponse("图书首页")在settings.py 中已经规定好了 ROOT_URLCONF 所以django 回到 urls.py中 寻找规则 匹配
采用在url中使用变量的方式进行传参 <参数名> 在视图函数中也写明参数 视图函数中的 参数名和 url中的参数名必须保持一致 在 url中可以传递多个参数
# Create your views here. from django.http import HttpResponse def book(request): return HttpResponse("图书首页") def book_detail(request,book_id,category_id): text = "您获取的图书id是:%s,图书分类是:%s" % (book_id,category_id) return HttpResponse(text) def author(request): author_id = request.GET['id'] #GET请求 获取参数的方式 text = "作者的ID是:%s" % author_id return HttpResponse(text) def publisher(request,publisher_id): text = "出版社的ID是:%s" % publisher_id return HttpResponse(text) urls.py urlpatterns = [ path('',index), path('book/',views.book), path('book/detail/<book_id>/<category_id>/',views.book_detail), path('book/author/',views.author), path('book/publisher/<slug:publisher_id>/',views.publisher), ]str 除了 / 以外的任意字符
int 只能是整型数字
path 所有的字符都是满足的
uuid 只有满足 uuid.uuid4() 返回的字符串格式才可以
import uuid
print(uuid.uuid4()) 6f0b06e2-273e-4844-9e6e-2ff0bd33d2f6
slug 英文的- 英文字符 阿拉伯数字 下划线 才满足
项目越来越大 所有的url 全部放到 urls 中 会非常庞大 关键是 不好管理 解决办法是 在每个app 中 新建一个urls.py 文件 所有跟app相关的url 全部放到这个里边 然后 主url 包裹 这个app的url
from django.http import HttpResponse # Create your views here. def book(request): return HttpResponse("图书首页") def book_detail(request,book_id): text = '图书的id是:%s' % book_id return HttpResponse(text) def book_list(request): return HttpResponse("图书列表页") book/urls.py from django.urls import path from . import views urlpatterns = [ #也要放到urlpatterns 变量中 path('',views.book), #/book path('detail/<int:book_id>/',views.book_detail), #主urls.py会跟这个进行拼接 注意不要多加/ path('list/',views.book_list), ]app_name 、 namespace
url是经常变化的 如果我们把url写死 会经常修改代码 可以给url请个名字 以后使用url 可以通过这个名字进行反转得到url 这样的话就不用写死
如何给它命名?
urlpatterns = [
path(’’,views.视图函数名,name=“”)
]
front app views.py from django.http import HttpResponse from django.shortcuts import redirect,reverse def index(request): #?username=xxx username = request.GET.get('username') if username: return HttpResponse("前台首页") else: login_url = reverse('front:login') print('=' * 50) print(login_url) print('=' * 50) return redirect(login_url) def login(request): return HttpResponse("前台登录页面") -------------- urls.py from django.urls import path from . import views app_name = 'front' # 需要先定义 app_name 变量 urlpatterns = [ path('',views.index,name='index'), #给url 起名 前提先给应用命名 path('signin/',views.login,name='login'), @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ cms app views.py 都有 index 和 login 直接redirect(‘/login/’) 容易出现一个问题 前台后台如果没有登录都跳转到前台登录也 我们的要求是 后台没登录 跳转到后台登陆页 from django.http import HttpResponse from django.shortcuts import redirect,reverse def index(request): #?username=xxx username = request.GET.get('username') if username: return HttpResponse("CMS后台首页") else: login_url = reverse('cms:login') print('=' * 50) print(login_url) print('=' * 50) return redirect(login_url) def login(request): return HttpResponse("CMS登录页面") urls.py from django.urls import path from . import views app_name = 'cms' urlpatterns = [ path('',views.index,name="index"), path('login/',views.login,name="login"), ]re_path 和 path的作用是一样的 不同的是re_path功能更加强大可以使用正则表达式
推荐是用 r’’ 原生字符串定义变量 需要使用() 包裹起来?P<参数名 >紧跟正则表达式规则 app的 views.py from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("文章首页") def article_list_year(request,year): text = '您输入的年份是:%s' % year return HttpResponse(text) def article_list_month(request,month): text = '您输入的月份是:%s' % month return HttpResponse(text) app的 urls.py from django.urls import re_path from . import views urlpatterns = [ #r代表的是原生字符串 re_path(r'^$',views.index), re_path(r'^list/(?P<year>\d{4})/$',views.article_list_year), re_path(r'^list/(?P<month>\d{2})/$',views.article_list_month), ]ps: 如果不是特别的要求 建议path就够了 特殊需求可以使用 避免把正则表达式规则忘记
反转url的时候 需要添加参数 可以在reverse方法中 通过 kwargs={“”:“”}
想要传递 查询字符串 或者 确定登录之后的跳转目标 next=