Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。
基本配置
一、创建django程序
- 终端命令:django-admin startproject sitename 在终端创建目录
- cd mysite
- python manage.py starapp app01 创建一个app
- IDE创建Django程序时,本质上都是自动执行上述命令
其他常用命令:
python manage.py runserver 0.0.0.0
python manage.py startapp appname
python manage.py syncdb
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
二、程序目录
三、配置文件
1、数据库
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘:‘dbname‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘xxx‘, ‘HOST‘: ‘‘, ‘PORT‘: ‘‘, } }
由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
2、模版
TEMPLATE_DIRS = ( os.path.join(BASE_DIR,‘templates‘), )
3、静态文件
STATICFILES_DIRS = ( os.path.join(BASE_DIR,‘static‘), )
路由系统
1、单一路由对应
url(r‘^index$‘, views.index),
2、基于正则的路由
url(r‘^index/(\d*)‘, views.index), url(r‘^manage/(?P<name>\w*)/(?P<id>\d*)‘, views.manage),
3、添加额外的参数
url(r‘^manage/(?P<name>\w*)‘, views.manage,{‘id‘:333}),
4、为路由映射设置名称
url(r‘^home‘, views.home, name=‘h1‘), url(r‘^index/(\d*)‘, views.index, name=‘h2‘),
设置名称之后,可以在不同的地方调用,如:
- 模板中使用生成URL {% url ‘h2‘ 2012 %}
- 函数中使用生成URL reverse(‘h2‘, args=(2012,)) 路径:django.urls.reverse
- Model中使用获取URL 自定义get_absolute_url() 方法
class NewType(models.Model): caption = models.CharField(max_length=16) def get_absolute_url(self): """ 为每个对象生成一个URL 应用:在对象列表中生成查看详细的URL,使用此方法即可!!! :return: """ # return ‘/%s/%s‘ % (self._meta.db_table, self.id) # 或 from django.urls import reverse return reverse(‘NewType.Detail‘, kwargs={‘nid‘: self.id})
获取请求匹配成功的URL信息:request.resolver_match
5、根据app对路由规则进行分类
url(r‘^web/‘,include(‘web.urls‘)),
6、命名空间
a. project.urls.py
from django.conf.urls import url,include urlpatterns = [ url(r‘^a/‘, include(‘app01.urls‘, namespace=‘author-polls‘)), url(r‘^b/‘, include(‘app01.urls‘, namespace=‘publisher-polls‘)), ]
b. app01.urls.py
from django.conf.urls import url from app01 import views app_name = ‘app01‘ urlpatterns = [ url(r‘^(?P<pk>\d+)/$‘, views.detail, name=‘detail‘) ]
c. app01.views.py
def detail(request, pk): print(request.resolver_match) return HttpResponse(pk)
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
- v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})
- {% url ‘app01:detail‘ pk=12 pp=99 %}
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。
通过反射机制,为django开发一套动态的路由系统Demo: 点击下载
Django目录介绍、路由系统、 ORM操作
Django目录介绍 django-admin startproject mysite 在终端创建目录 cd mysite python manage.py starapp app01 创建一个app project - app01 -migrations 和数据库相关,和modal相关 - admin Django自带后台管理相关配置 - modal 写类,根据类创建数据库表 - test 单元测试 - views 业务处理,业务可以分类 - app02 - app03 1. 路由系统(位置参数和形式参数不要不要混用,*args,**kwargs可以接收参数) url -> 函数 a. /login/ -> def login SEO权重不高 b. /add-user/(\d+)/ -> def add_user(request,a1) /add-user/(\d+)/(\d+)/ -> def add_user(request,a1,a2) 位置参数 c. /add-user/(?P<a1>\d+)/ -> def add_user(request,a1) 形式参数 url(r‘^index/‘, views.index), 访问时必须index/这种形式 url(r‘^index$‘, views.index), 访问时必须index这种形式 url(r‘^index‘, views.index), 访问时index开头的任意字符串都可以访问 url(r‘^index/(\d+).html‘, views.index), 访问时必须index/(\d+).html开头的这种形式 url(r‘^‘, views.index) 没有匹配成功,设置默认html PS: 终止符: ^edit$ 伪静态 提高SEO权重 url(r‘^edit/(\w+).html$‘, views.edit), d. 路由分发 urls.py中 导入from django.conf.urls import include url(r‘^app01/‘, include(‘app01.urls‘)), 先在总路由匹配app路径,然后去该app下urls.py中去匹配路径 app01.urls.py url(r‘^index.html$‘, views.index), e. 路由系统之别名反向生成url 根据名称可以反向生成URL 1. url(r‘^index/‘, views.index,name="n1) 在Python代码中,在viws.py中 def index(request): from django.urls import reverse v = reverse(‘n1‘) print(v) #生成url路径/index/ url(r‘^index/(\d+)/‘, views.index,name="n1) 在Python代码中,在viws.py中 def index(request,a1): from django.urls import reverse v = reverse(‘n1‘,args={451}) print(v) #生成url路径/index/451/ url(r‘^index/(?P<a1>\d+)/‘, views.index,name="n1) 在Python代码中,在viws.py中 def index(request,a1): from django.urls import reverse v = reverse(‘n1‘,kwargs={‘a1‘:1111}) print(v) #生成url路径/index/1111/ 2. 在路由文件中 url(r‘^login/‘, views.login,name=‘m1‘) 在html文件中 {% url "m1" %} 提交就可以找到/login/路径 在路由文件中 url(r‘^login/(\W)/‘, views.login,name=‘m1‘) url(r‘^login/(\W).html$‘, views.login,name=‘m1‘) 在html文件中 {% for i in user_list %} <li>{{ i }}|<a href="{% url "m1" i %}">编辑</a></li> {% endfor %} 提交就可以找到/login/i路径 提交就可以找到/login/i.html路径 3. ORM操作 ORM利用pymysql第三方工具连接数据库 默认:使用SQLlite 数据库 Http请求: url -> 视图(模板+数据) 步骤: 1. 创建数据库:在数据库创建70db 2. 在settings中设置 # DATABASES = { # ‘default‘: { # ‘ENGINE‘: ‘django.db.backends.sqlite3‘, # ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘), # } # } DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘:‘70db‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘‘, ‘HOST‘: ‘localhost‘, ‘PORT‘: 3306, } } 3. 在项目__init__.py中更换默认连接数据库的方式,MySQLDB(修改django默认连接mySQL方式) import pymysql pymysql.install_as_MySQLdb() 4.在app下的models.py下:创建表 from django.db import models class user_group(models.Model): title = models.CharField(max_length=32) class user_info(models.Model): id = models.BigAutoField(primary_key=True) #这一列不写也会自动生成 username=models.CharField(max_length=32) password=models.CharField(max_length=64) # age = models.IntegerField(null=True) #设置可以为空,创建表后插入这一列时可以这么设置 age = models.IntegerField(default=1) #默认生成ug_id,设置可以为空,创建表后插入这一列时可以这么设置 ug = models.ForeignKey("user_group",null=True) 5.在配置中注册app INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01‘ ] 6.创建数据表 命令: python manage.py makemigrations python manage.py migrate ORM操作表: 创建表 修改表 删除表 操作数据行: 增删改查 基于ORM实现组表操作 #新增 # models.user_group.objects.create(title="销售部") # models.user_info.objects.create(user=‘root‘,password=‘pwd‘,age=18,ug_id=1) # 查找 # group_list = models.user_group.objects.all() # group_list = models.user_group.objects.filter(id=1) # group_list = models.user_group.objects.filter(id__gt=1) #大于 # group_list = models.user_group.objects.filter(id__lt=1) #小于 # print(group_list) #group_list是QuerySet类型,可以看成列表 # group_list QuerySet类型(列表) # QuerySet类型[obj,obj,obj] # for row in group_list: # print(row.id,row.title) # models.user_info.objects.all() # 删除 # models.user_group.objects.filter(id=2).delete() # 更新 # models.user_group.objects.filter(id=2).update(title=‘公关部‘) 基于ORM实现员工表操作 1.增加 models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug_id=1) obj = models.UserGroup.objects.filter(id=1).first() models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug=obj) 2. 删除: models.UserInfo.objects.filter(id=2).delete() 3. 修改: models.UserInfo.objects.filter(id=2).update(title=‘公关部‘) 4. 查询: group_list = models.UserInfo.objects.all() group_list获取的是QuerySet,内部元素是UserInfo对象,每一个对象代指一行数据, 对象中如果包含ForeignKey,则代指与其关联表的一行数据 for row in group_list: print(row.user) print(row.age) print(row.ug_id) # 用户信息关联的部门ID print(row.ug.title) # 用户信息关联的部门名称
时间: 2024-10-16 04:39:53