我已经创建了一个django网络应用程序,其中包含一个简单的用户表(用户名/密码)。我也有一个iOS应用程序(swift)设置,并想知道什么是编写登录系统的最佳方式?
从我从研究中收集到的内容 - 我将不得不对从现有django应用程序创建的API进行REST调用。为此使用TastyPie或Django Rest Framework会更好吗?
在为django应用程序执行API时,我是否需要记住具体的事项?另外,我用于其余调用的url是什么,它是django web应用程序所在的现有服务器吗?
答案 0 :(得分:3)
我对此答案的资格来自于与您描述的系统相同的系统上的3个月的工作。你的问题包含很多部分,所以我将从服务器开始。
从我从研究中收集到的内容 - 我将不得不制作REST 调用从现有django应用程序创建的API。
正确,您的客户(应用,网络或其他)应通过API与您的服务器通信。
我已经创建了一个django网络应用程序,带有一个简单的用户表 (用户名/密码)。
希望您的“简单用户表”使用默认的Django用户模型,因为在保护开放API时,第三方安全框架将使您的生活变得更加简单。虽然这取决于您的安全需求,但我建议使用Django OAuth Toolkit来获取其OAuth2支持,密码重置工作流以及用于常见身份验证交互的预建URL端点。更好的是,这个库原生支持Django Rest Framework。
为此使用TastyPie或Django Rest Framework会更好吗?
我没有使用TastyPie的经验,但我可以担保DRF。 generic views与我们的主要API设计点相匹配,DRF与Django Form API的相似性意味着我们的自定义仪表板与API具有完美的对称性。我建议您首先绘制API的主要组件,然后研究两个框架,以了解最适合您项目的框架。
(额外提示:如果这是您第一次设计REST API,请翻阅Build APIs You Won't Hate的副本)
此外,我将用于其余呼叫的网址是什么 django Web应用程序所在的现有服务器?
通常的做法是在子域上托管您的API网址,然后是版本路径,例如api.example.com/v1/
。子域将您的URL与核心网页分开,并表示这些端点专门用于您的API。在升级时,版本路径是支持旧API的良好做法。
在执行API时,我是否需要记住具体的事项 对于django app?
安全性很重要。根据您的API,您的应用程序的某些敏感部分可能会向公众公开。编写测试以确保您不会在安全性中发现新漏洞,并leave OAuth to the pros。除此之外,请确保您的服务器已准备好处理流量,并花费大量时间perfecting your model。
我也有一个iOS应用程序(swift)设置,并想知道会是什么 编写登录系统的最佳方法是什么?
在客户端编码时,始终使用最佳实践来检索和存储凭据。通过SSL与您的服务器通信,仅存储您需要的内容,并在用户注销时销毁预期的数据。请记住,如果您的应用程序存储用户名和密码,它会存储敏感数据(因为人们对reuse passwords for important things有一种有趣的倾向)。最后,通过有用的错误消息和加载动画,清楚地将登录过程传达给您的用户。正如您现在所看到的,登录过程相当复杂,但如果执行得当,它将毫不费力。
答案 1 :(得分:1)
登录表格
class ViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate{
@IBOutlet var txtemail: UITextField!
@IBOutlet var txtpass1: UITextField!
@IBOutlet var lbl1: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
txtemail.becomeFirstResponder()
}
@IBAction func btnlogin(_ sender: UIButton) {
let useremail = txtemail.text
let userpass = txtpass1.text
if ((useremail!.isEmpty) || (userpass!.isEmpty))
{
Displayalert(usermessage: "All Fields Are Required...")
}
// MARK:- Display Id
let useremailstore = UserDefaults.standard.string(forKey: "useremail")
let userpasswordstore = UserDefaults.standard.string(forKey: "userpass")
// MARK:- Login New Page
if useremail != useremailstore
{
Displayalert(usermessage: "Enter Valid Email")
}
else if userpass != userpasswordstore
{
Displayalert(usermessage: "Enter Valid Password..")
}
else
{
let wel = storyboard?.instantiateViewController(withIdentifier: "welcomeViewController")as! welcomeViewController
self.navigationController?.pushViewController(wel, animated: true)
}
if useremailstore == useremail
{
if userpasswordstore == userpass
{
UserDefaults.standard.set(true, forKey: "userlogin")
UserDefaults.standard.synchronize()
self.dismiss(animated: true, completion: nil)
}
}
}
@IBAction func btnforgotpass(_ sender: UIButton) {
let pass = storyboard?.instantiateViewController(withIdentifier: "NewPassViewController")as! NewPassViewController
self.navigationController?.pushViewController(pass, animated: true)
}
@IBAction func btnnewacc(_ sender: UIButton) {
let login = storyboard?.instantiateViewController(withIdentifier: "RegisterViewController")as! RegisterViewController
self.navigationController?.pushViewController(login, animated: true)
}
// MARK:- Alert function
func Displayalert(usermessage:String)
{
let Myalert = UIAlertController(title: "Alert", message: usermessage, preferredStyle: UIAlertControllerStyle.alert)
let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil)
Myalert.addAction(Action)
self.present(Myalert, animated: true, completion: nil)
}
// MARK:- Password set
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == txtpass1
{
let text = txtpass1.text
let newLength = (text?.characters.count)! + string.characters.count - range.length
return newLength <= 8 // Bool
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
txtemail.resignFirstResponder()
txtpass1.resignFirstResponder()
return false
}
override func viewWillAppear(_ animated: Bool) {
txtemail.text = ""
txtpass1.text = ""
}
注册表格
类RegisterViewController:UIViewController,UITextFieldDelegate,UITextViewDelegate {
@IBOutlet var txtmail: UITextField!
@IBOutlet var txtpass: UITextField!
@IBOutlet var txtrepass: UITextField!
var defaults = UserDefaults.standard
var dict : NSMutableDictionary = ["":""]
override func viewDidLoad() {
super.viewDidLoad()
txtmail.becomeFirstResponder()
return
// Do any additional setup after loading the view.
}
// MARK:- Register
@IBAction func btnregister(_ sender: UIButton) {
let useremail = txtmail.text
let userpass = txtpass.text
let userrepass = txtrepass.text
if((useremail!.isEmpty) || (userpass!.isEmpty) || (userrepass!.isEmpty))
{
Displayalert(usermessage: "All Fields Are Required....")
}
if userpass != userrepass
{
Displayalert(usermessage: "Your Re-Password is Not valid....")
txtrepass.text = ""
}
let validEmail = isValidEmail(stringValue: txtmail.text!)
if validEmail
{
print("Email is Valid")
}
else
{
Displayalert(usermessage: "Email Is Not Valid...")
}
//MARK:- Store Data
UserDefaults.standard.set(useremail, forKey: "useremail")
UserDefaults.standard.set(userpass, forKey: "userpass")
UserDefaults.standard.synchronize()
//MARK:- Conformation message
let Myalert = UIAlertController(title: "Alert", message: "Registation is Successful.Thank you...", preferredStyle: UIAlertControllerStyle.alert)
let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default) { action in self.performSegue(withIdentifier: "firstview", sender: self)}
Myalert.addAction(Action)
self.present(Myalert, animated: true, completion: nil)
}
//MARK:- Alert Call
func Displayalert(usermessage:String)
{
let Myalert = UIAlertController(title: "Alert", message: usermessage, preferredStyle: UIAlertControllerStyle.alert)
let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil)
Myalert.addAction(Action)
self.present(Myalert, animated: true, completion: nil)
}
//MARK:- Email Valid
func isValidEmail(stringValue: String) ->Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: stringValue)
}
// MARK: - 相同&amp;重新密码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == txtpass
{
let text = txtpass.text
let newLength = (text?.characters.count)! + string.characters.count - range.length
return newLength <= 8 // Bool
}
if textField == txtrepass
{
let text = txtrepass.text
let newLength = (text?.characters.count)! + string.characters.count - range.length
return newLength <= 8 // Bool
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
txtmail.resignFirstResponder()
txtpass.resignFirstResponder()
txtrepass.resignFirstResponder()
return false
}